Как понять пятую нормальную форму?

Я использую два онлайн-источника для получения понимания 5NF без каких-либо ограничений математики и доказательств.

Однако я не могу понять ни одну из этих ссылок!

Рассмотрим сначала ссылку № 1 (Кент).

В нем говорится: "Но предположим, что действовало определенное правило: если агент продает определенный продукт, и он представляет компанию, производящую этот продукт, тогда он продает этот продукт для этой компании".

и, далее, продолжает разбивать исходную таблицу (все имена таблиц были предоставлены мной)...

acp(agent, company, product)

-----------------------------
| AGENT | COMPANY | PRODUCT |
|-------+---------+---------|
| Smith | Ford    | car     | 
| Smith | Ford    | truck   | 
| Smith | GM      | car     | 
| Smith | GM      | truck   | 
| Jones | Ford    | car     | 
-----------------------------

... в 3 таблицы:

ac(agent, company)
cp(company, product)
ap(agent, product)

-------------------   ---------------------   ------------------- 
| AGENT | COMPANY |   | COMPANY | PRODUCT |   | AGENT | PRODUCT |
|-------+---------|   |---------+---------|   |-------+---------|
| Smith | Ford    |   | Ford    | car     |   | Smith | car     |
| Smith | GM      |   | Ford    | truck   |   | Smith | truck   |
| Jones | Ford    |   | GM      | car     |   | Jones | car     |
-------------------   | GM      | truck   |   -------------------
                      ---------------------

Но я даже не уверен, понимаю ли я англоязычный смысл вышеупомянутого правила. Мое понимание вышеизложенного правила заключается в том, что его предложение "then" полностью избыточно! Для,

IF агент продает продукт

И

IF, этот агент представляет компанию, производящую этот продукт,

THEN, OBVIOUSLY,, этот агент продает этот продукт для этой компании.

Итак, где "правило" в этом утверждении? Это, по сути, кажется мне не-выражением!

Работа в обратном направлении из трех таблиц - ac, cp и ap - кажется правилом действительно: "Компания может создавать 1 или более продуктов, агент может представлять 1 или более компаний, а также представлять компанию он может или не может продавать все свои продукты".

Но исходная таблица acp уже захватила это правило. Итак, я не уверен, что здесь происходит с объяснением 5NF.

Теперь рассмотрим ссылку № 2 (Википедия).

В нем говорится: "Предположим, однако, что применимо следующее правило:" В своем репертуаре у продавца есть определенные бренды и определенные типы продуктов. Если в его репертуаре находятся бренды B1 и Brand B2, а Product Type P - в его репертуаре, тогда (при условии, что Бренд B1 и Бренд B2 оба производят тип продукта P), Traveling Salesman должен предлагать продукты типа продукта P, сделанные маркой B1, и марки, сделанные брендом B2. "

Еще раз, идя только по английскому языку этого правила и ничего больше,

IF у продавца есть марки B1 и B2, а продукт P с ним,

И

IF продукт P производится обоими брендами B1 и B2,

THEN, почему бы ему не предложить продукт P брендов B1 и B2 так, как он мог, в оригинальной 3-столбцовой таблице sbp (продавец, бренд, продукт) "который хорошо служил еще до того, как это новое" правило "вступило в силу?

Может кто-нибудь прояснить?

Ответ 1

Видите, это намного легче понять вещь назад.

Сначала 5NF; таблица (реляционная переменная) находится в 5NF, если разложение не приведет к удалению избыточности. Итак, это окончательный NF в отношении устранения избыточности.

Оригинальная таблица, очевидно, имеет некоторую избыточность. Он утверждает, что "Смит представляет Форда". дважды, а "Смит - GM". в два раза.

Итак, давайте посмотрим, можно ли разложить это на две или более проекций и уменьшить некоторую избыточность.

Начните движение назад.

  • Компания существует. {COMPANY}

  • Агент существует. {AGENT}

  • Продукт существует. {PRODUCT}

  • Компания производит продукт. {COMPANY, PRODUCT}

  • Агент представляет компанию. {AGENT, COMPANY}

Пауза здесь; предположим, что правило: "Если агент представляет компанию, а компания производит продукт, агент продает этот продукт".

Это будет просто {AGENT, COMPANY} JOIN {COMPANY, PRODUCT}; но это создаст дополнительный кортеж, а именно (Jones, Ford, truck); что не так, потому что Джонс не продает грузовики.

Таким образом, не каждый агент продает каждый продукт, поэтому необходимо указать это явно.

  • Агент продает продукт. {AGENT, PRODUCT}

Теперь, если мы присоединяемся к

{AGENT, COMPANY} JOIN {COMPANY, PRODUCT} JOIN {AGENT, PRODUCT}

что дополнительный кортеж исключается соединением в {AGENT, PRODUCT}.

Чтобы понять вещи интуитивно, правило может быть немного изменено.

Оригинал

Если агент продает определенный продукт, он представляет компанию делая этот продукт, тогда он продает этот продукт для этой компании.

Изменено (то же значение)

Если агент продает продукт, а агент представляет компанию, и компания делает этот продукт, тогда агент продает этот продукт для эта компания.

Разъяснение (замените вышеописанные пункты)

Если {AGENT, PRODUCT} и {AGENT, COMPANY} и {COMPANY, PRODUCT}то {AGENT, COMPANY, PRODUCT}.

Таким образом, правило допускает соединение, а значит, и разложение.

Теперь сравним это с предикатом исходной таблицы:

Агент представляет компанию и продает некоторый продукт, который компания делает.

Не то же самое, что и правило, поэтому оно открыто для аномалий, которые нарушали бы правило - см. пример Билла Карвина.


EDIT (см. комментарии ниже)

Предположим, что у нас есть исходная таблица, но не правило.

Очевидно, что в таблице есть избыточность, поэтому мы можем задаться вопросом, есть ли способ удалить эту избыточность каким-то образом - обычным способом является декомпозиция в проекции таблицы.

Итак, после некоторого вмешательства мы выясним, что его можно разложить на {AGENT, PRODUCT}, {AGENT, COMPANY}, {COMPANY, PRODUCT}. Текущие данные, безусловно, позволяют это - согласно вашему примеру.

И мы делаем это, и всякий раз, когда вас интересует "Какой агент продает какой продукт у какой компании?" ответ просто

{AGENT, COMPANY} JOIN {COMPANY, PRODUCT} JOIN {AGENT, PRODUCT}

Затем появляется Honda, и они тоже делают автомобили и грузовики. Нет проблем, просто вставьте (Honda, truck) , (Honda, car) в {COMPANY, PRODUCT}.

Затем Смит решает продать автомобили Honda, но не грузовики. Извините, нет способа, уп! Поскольку он уже продает автомобили и грузовики, если он хочет представлять Honda, он должен продать оба.

Поскольку у нас бы были кортежи

(Smith, Honda) (Honda, truck) (Smith, truck)
               (Honda, car)   (Smith, car)

Итак, у нас есть введенное правило! На самом деле не хотел - просто пытался избавиться от некоторой избыточности.

Вопрос в том, был ли исходный набор данных просто случайностью или это было результатом правила, которое каким-то образом было принудительно за пределами БД?

Автор (Кент) утверждает, что это правило существует, и дизайн не соответствует ему. Разумеется, для исходной таблицы не было бы проблемой принимать только (Smith, Honda, car) - не требуя (Smith, Honda, truck).


Теоретическая точка (игнорируйте, если расточка)

Правило

If {AGENT, PRODUCT} and {AGENT, COMPANY} and {COMPANY, PRODUCT} then {AGENT, COMPANY, PRODUCT}; для каждой тройки (Agent, Company, Product).

явно указывает, что зависимость соединения

* { {AGENT, COMPANY}, {COMPANY, PRODUCT}, {AGENT, PRODUCT} }

выполняется для исходной таблицы.


Как часто говорят, такие случаи редко встречаются; на самом деле так редко, что даже примеры учебников должны вводить странные правила, чтобы объяснить основную идею.


EDIT II (забавная часть, но может помочь понять)

Пустьчто это правило не существует, и существует явное требование, чтобы любой агент мог продавать то, что когда-либо он хотел от какой-либо компании, поэтому правило было бы неправильно.

В этом случае мы имеем исходную таблицу

{AGENT, COMPANY, PRODUCT}

Я бы сказал, что:

  • Будучи полностью ключом, он находится в BCNF.

  • Он не может быть разложен (текущие данные могут его разрешить, но в будущем нет).

  • В BCNF, все ключи, он не может быть разложен, следовательно, он находится в 5NF.

  • Он находится в 5NF и имеет все ключи, поэтому он находится в 6NF.

Таким образом, наличие или отсутствие правила определяет, находится ли таблица в BCNF или 6NF - те же самые данные таблицы.

Ответ 2

Все нормальные формы предназначены для предотвращения аномалий, то есть логических несоответствий в данных.

Существует аномалия, когда вы нарушаете 5-ю нормальную форму, представленную этим соотношением:

-----------------------------
| AGENT | COMPANY | PRODUCT |
|-------+---------+---------|
| Smith | Ford    | car     | 
| Smith | Ford    | truck   | 
| Smith | GM      | car     | 
| Jones | Ford    | car     | 
| Jones | GM      | truck   | 
-----------------------------

Итак, мы знаем, что Джонс работает для GM и Ford, и мы знаем, что Джонс продает автомобили и грузовики. И мы знаем (от Смита), что GM делает автомобили. Так почему же нет строки для [Jones, GM, car]? Это аномалия. Джонс должен продавать автомобили GM, но в этой таблице ничего нет, что делает это непротиворечивым.

Проблемы возникают из попыток использовать одно отношение для представления нескольких независимых фактов.
Если мы будем представлять эти независимые факты в качестве независимых отношений ac, cp и ap, то мы удалим возможность аномалий.


Ваш комментарий:

В целях этого примера мы предполагаем, что продавец мотивирован продавать все, что может. Если он может продать тип транспортного средства, и он работает в компании, и компания делает этот тип транспортного средства, тогда продавец обязательно его продаст.

Это предположение указано в статье Уильяма Кента:

Но предположим, что действовало определенное правило: если агент продает определенный продукт, и он представляет компанию, производящую этот продукт, то он продает этот продукт для этой компании.

Таким образом, исходя из этой предпосылки, подразумевается, что каждая возможная допустимая комбинация должна приводить к строке в таблице с тремя столбцами. Это бизнес-правило, которое мы хотим, чтобы данные удовлетворяли.

Но в тех случаях, когда наша единственная таблица не содержит одну из строк, необходимых для согласования с этой предпосылкой, она не может представлять бизнес-правило. В принципе, поскольку он вводит возможность того, что "факт" хранится избыточно.

Разделив факты на три таблицы, каждый факт хранится ровно один раз. Результат JOIN между тремя более простыми таблицами, естественно, создает отношение, подобное исходной таблице с тремя столбцами, за исключением того, что не имеет аномалий.

Ответ 3

"Если агент продает продукт

и

ЕСЛИ этот агент представляет компанию, производящую этот продукт,

ТОГДА, ОЗНАКОМИТЕЛЬНО, этот агент продает этот продукт для этой компании. "

Это просто совершенно неправильно. Полностью. Подумайте об этом еще раз.

Форд делает такси. Форд делает сосиски. GM делает такси. GM делает сука.

Я представляю Форда. Я представляю GM. Я продаю такси. Я продаю сосиски.

Теперь все эти 8 операторов истинны в случае, когда:

Я продаю такси, но только вид Форда. Я продаю суку, но только вид GM.

Ответ: да, они есть.

Тот факт, что я представляю Ford для какого-то продукта, и я продаю его для какого-то производителя, а Ford - это сучки, логически не подразумевает, что я продаю суки Форда.