Эти таблицы в третьей нормальной форме?

Я разложил отношения, которые отслеживают сотрудников и часы, которые они провели, работая в отелях. Исходные отношения следующие

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!

Следовательно, разделите таблицу, как рекомендовано во вступлении.

Другие вопросы по тегам