Эти таблицы в третьей нормальной форме?
Я разложил отношения, которые отслеживают сотрудников и часы, которые они провели, работая в отелях. Исходные отношения следующие
R(national insurance number, contract Number, hours, eName, hotel Number, hotel Location)
переписан как
R(A, B, C, D, E, F)
Я нашел функциональные зависимости
F:(A->D, E->F, AB->C, B->E, BA->E)
Из этого я создал следующие 3 таблицы
1.
Employees:
national insurance number(A)
eName(D)
PRIMARY KEY(A)
2.
Works at:
contract Number(B)
Hours(C)
national insurance number(A)
PRIMARY KEY(B, AND A)
3.
Hotel:
contract Number(B)
hotel Number(E)
hotel Location(F)
PRIMARY KEY(B)
В моей третьей таблице у меня есть первичный ключ, который может определять как номер, так и местоположение отеля. Но номер отеля также может определять местоположение отеля. Должен ли я переместить расположение отеля на новый стол, используя только номер отеля? Это заняло бы больше места, но необходимо ли достичь 3-й нормальной формы?
2 ответа
Кажется, ты прав. Отель должен быть в отдельной таблице.
Также я предполагаю, что у сотрудника есть возможность работать над более чем одним контрактом в более чем одном отеле, и в одном отеле может быть более одного контракта для сотрудника.
Итак, для меня нормализованная форма будет выглядеть так:
1. Employees:
national insurance number(A)
eName(D)
PRIMARY KEY(A)
2. Hotels:
hotel Number(E)
hotel Location(F)
PRIMARY KEY(E)
3. Contracts:
contract Number(B)
hotel Number(E)
PRIMARY KEY(B)
FOREIGN KEY(Hotels.E)
4. Works at:
work at(G),
national insurance number(A)
contract Number(B)
Hours(C)
PRIMARY KEY(G)
FOREIGN KEY(Employees.A)
FOREIGN KEY(Contracts.B)
Если предположить, что полученные вами FD являются правильными и полными, для достижения 3-й нормальной формы в ваших настройках необходимо на самом деле разделить Hotel(B,E,F) { B->E, E->F }
в HotelContract(B,E) { B->E }
а также Hotel(E,F) { E->F }
, Формально в { B->E, E->F }
, B
является (единственным) ключом, E
является "непростым" атрибутом (т.е. не является частью какого-либо ключа), и, следовательно, F
транзитивно зависит от не простого атрибута от ключа. Это нарушает третью нормальную форму.
Со схемой Hotel(B,E,F) { B->E, E->F }
, который нарушает 3NF, вы получаете "аномалию удаления", то есть вы теряете больше информации, чем необходимо при удалении кортежа из Hotel
, Предположим следующее расширение Hotel
:
Hotel
B | E | F
---|---|---
b1 | e1| f1
b2 | e2| f2
Когда вы удаляете кортеж (b2,e2,f2)
тогда вы потеряете информацию о том, что отель e2
находится в f2
, хотя вы просто хотели удалить контракт.
Еще хуже, когда вы переводите схему в
Hotel:
contract Number(B)
hotel Number(E)
hotel Location(F)
PRIMARY KEY(B)
тогда вы на самом деле опускаете FD E->F
, что позволило бы, что тот же отель e1
например, получает два разных местоположения f1
а также f2
:
Hotel
B | E | F
---|---|---
b1 | e1| f1
b2 | e1| f2 -> permitted by your scheme, but not intended!
Следовательно, разделите таблицу, как рекомендовано во вступлении.