Функциональные зависимости отношения сообщения пользователя

ОБНОВЛЕНИЕ: реляционная модель может работать не так, как я хочу, см.:Нормализация базы данных для системы обмена сообщениями наподобие facebook Время для NoSQL!

У меня возникли проблемы с размещением базы данных в 2nf. Для этого вы должны определить все функциональные зависимости, прежде чем вы сможете решить, является ли атрибут простым или не простым.

Посмотрите здесь:

--------------------------------------------
   to   |  from  |   msg          |  time  
--------|--------|----------------|---------
  joe   |  jim   | hello          |   1
  jim   |  joe   | hey            |   2
  jim   |  joe   | how are you    |   3
 victor |  bryce | i love carrots |   4
  joe   |  jim   | im doin great  |   5
  bryce |  jim   | hello          |   6

ПРИМЕЧАНИЕ. Время будет уникальным. Он будет заключен.

Отправляет время->сообщение, несмотря на

time1->"hello"
time6->"hello"

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

Кроме того, я хочу добавить столбец идентификатора сообщения. Это хорошая практика?


person Steve Webster    schedule 02.10.2016    source источник
comment
Ссылка в вашем редактировании имеет жалкий ответ.   -  person Mike Sherrill 'Cat Recall'    schedule 02.10.2016


Ответы (1)


Функциональная зависимость спрашивает: «Если я знаю одно значение для «X», знаю ли я одно и только одно значение для «Y»?», где «X» и «Y» являются атрибутами отношения. ("X" и "Y" относятся к наборам атрибутов.)

Если значения атрибута «время» на самом деле уникальны, то знание одного значения для «времени» означает, что вы знаете одно и только одно значение для «msg». Это означает, что для этого отношения выполняется функциональная зависимость time->msg.

Напротив, функциональная зависимость "to"->"msg" в этом отношении не выполняется, поскольку знание значения "joe" означает, что я знаю два значения для "msg": "hello" и «У меня все отлично». Это неверно для этого отношения, поэтому мы говорим, что «to» -> «msg» не является функциональной зависимостью в этом отношении.

Точно по той же причине "to, from"->"msg" не имеет места в этом отношении. Таким образом, «to, from» -> «msg» не является функциональной зависимостью в этом отношении.

Кроме того, я хочу добавить столбец идентификатора сообщения. Это хорошая практика?

Добавление атрибутов, не входящих в исходное отношение, связано со сжатием данных, а не с нормализацией. Нормализация никогда не вводит новые атрибуты или новые зависимости. Добавление «msg_id» в качестве атрибута вводит две новые функциональные зависимости (в зависимости от того, что означает «msg_id»): «msg_id» -> «msg» и «time» -> «msg_id».

Так что добавление атрибута «msg_id» иногда может быть хорошей идеей (реже, чем вы думаете), но это не имеет ничего общего с нормализацией. Предполагая, что вы намерены спроецировать «msg_id, msg» как новую таблицу и удалить «msg» из исходного отношения, вам также необходимо объявить «msg» уникальным.

person Mike Sherrill 'Cat Recall'    schedule 02.10.2016
comment
как бы вы починили эту базу данных, чтобы заставить ее работать на практике, чтобы я мог получить ее на 2nf - person Steve Webster; 02.10.2016
comment
@SteveWebster: Если время-›to, from, msg, что кажется разумным, это отношение уже находится в BCNF. Это означает, что он также находится в 3NF, 2NF и 1NF. Неформально, поскольку а) время является единственным ключом-кандидатом и б) время представляет собой один столбец, оно должно находиться во 2НФ. (У вас должно быть несколько столбцов в ключе-кандидате, прежде чем вы сможете иметь зависимость частичного ключа.) Поскольку время — единственный атрибут в левой части функциональной зависимости, не может быть транзитивных зависимостей, поэтому оно должно быть в 3НФ. Поскольку каждая стрелка в каждом FD является стрелкой из ключа-кандидата, она должна быть в BCNF. - person Mike Sherrill 'Cat Recall'; 02.10.2016
comment
но на практике выдержит ли time-›msg? два сообщения, скорее всего, будут повторяться в социальной сети - person Steve Webster; 03.10.2016
comment
@SteveWebster: Да, time-›msg сохранится, потому что время уникально. (Вы сказали.) - person Mike Sherrill 'Cat Recall'; 03.10.2016
comment
Если я знаю одно значение для «X», знаю ли я одно и только одно значение для «Y»?, где «X» и «Y» являются атрибутами отношения. («X» и «Y» относятся к наборам атрибутов.) (Вы сказали в своем ответе) время уникально, хорошо, но не msg. Я знаю уникальные значения для X, но не уникальные значения для Y. Y — это msg. См. пример. - person Steve Webster; 03.10.2016
comment
@SteveWebster: Представьте, что вы выполняете оператор SQL select msg from yourtablename where time = 1;. Сколько значений вы увидите для msg? - person Mike Sherrill 'Cat Recall'; 03.10.2016
comment
Спасибо! Меня смутил язык. - person Steve Webster; 03.10.2016