Как понять 5-ю нормальную форму?
Я использую два онлайн-источника для получения понимания 5NF, без какой-либо строгости математики и доказательств.
- простое руководство по пяти обычным формам в теории реляционных баз данных (by Kent. Этот, кажется, был рассмотрен и одобрен в одном из его произведений не кем иным, как самим CJ Date)
- Пятая Нормальная Форма (статья в Википедии)
однако, я не могу понять ни этих ссылки!
давайте сначала рассмотрим ссылку №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 | -------------------
---------------------
но я даже не конечно, если я понимаю англоязычное значение вышеуказанного правила. Мое понимание вышеуказанного правила заключается в том, что его 'тогда' предложение абсолютно лишними! Для
если агент продает продукт
и
если этот агент представляет компанию, производящую этот продукт,
ТОГДА, ОЧЕВИДНО, этот агент продает этот продукт для этой компании.
Итак, где же "правило" в этом утверждении? На самом деле, мне кажется, что это не утверждение!
работа в обратном направлении от трех таблиц-ac, cp и ap-кажется, правило действительно:"компания может производить 1 или более продуктов, агент может представлять 1 или более компаний, а представляя компанию, он может продавать или не продавать все ее продукты."
но исходная таблица acp уже захватила это правило. Так что я не уверен, что это продолжая здесь с объяснением 5NF.
давайте теперь рассмотрим ссылку №2 (Википедия).
Он говорит:
еще раз, исходя только из англоязычного значения этого правила и ничего больше,
если у продавца есть бренды B1 и B2, и продукт P с ним,
и
если продукт P сделан обоими таврами B1 и B2,
затем, почему бы ему не предложить продукт P брендов B1 и B2 так же, как он мог бы в оригинальной таблице из 3 столбцов " sbp (продавец, бренд, продукт)", которая хорошо служила еще до того, как это новое "правило" вступило в силу?
может кто-нибудь уточнить?
2 ответов
видите, гораздо легче понять эту вещь задом наперед.
сначала 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}
.
Итак, правило позволяет соединению произойти - и, следовательно, разложение.
теперь сравните это с предикатом исходной таблицы:
агент представляет собой компанию и продает некоторые продукт что компания делает.
не то же самое, что правило, поэтому он открыт для аномалий, которые нарушат правило-см. пример Билла Карвина.
редактировать (см. комментарии ниже)
предположим что у нас есть исходная таблица, но не правилом.
очевидно, что в таблице есть некоторая избыточность, поэтому мы можем задаться вопросом если есть способ каким-то образом удалить эту избыточность-обычным способом является разложение на проекции таблицы.
Итак, после некоторых манипуляций мы выясняем, что его можно разложить на {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 (забавная часть, но может помочь понимание)
предположим
в таком случае у нас есть исходная таблица я бы сказал, что: будучи all-key, он находится в BCNF. его нельзя разложить (текущие данные может позволить, но будущее-нет). он находится в BCNF, весь ключ, он не может быть разложен, следовательно, он находится в 5NF. он находится в 5НФ и все-ключ, поэтому в 6NF. таким образом, наличие или отсутствие правила определяет, находится ли таблица в BCNF или 6NF -- same table same data.{AGENT, COMPANY, PRODUCT}
все нормальные формы предназначены для предотвращения аномалий, т. е. логических несоответствий в данных.
возможна аномалия, когда вы нарушаете 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]
? Это аномалия. Джонс!--10-->должны продажа автомобилей GM, но в этом нет ничего таблица, которая делает это последовательным.
проблемы возникают при попытке использовать одно отношение для представления нескольких независимых фактов.
Если мы вместо этого представим эти независимые факты как независимые отношения ac
, cp
и ap
, затем мы удаляем возможность аномалий.
Re ваш комментарий:
для целей этого примера мы предполагаем, что продавец мотивирован продавать все, что он может. Если он can продать тип транспортного средства, и он работает на компанию, и компания делает этот тип транспортного средства, то продавец обязательно продаст его.
эта предпосылка изложена в статье Уильяма Кента:
Итак, основываясь на этой предпосылке, он неявно, что каждая возможная допустимая комбинация должна приводить к строке в таблице с тремя столбцами. Это бизнес-правило, которое мы хотели бы, чтобы данные удовлетворяли.