0

Предположим, у меня есть сайт, на котором любой человек может покупать и продавать товары, а 2 зарегистрированных пользователя могут отправлять друг другу сообщения о товаре. Одна из отношений в моей базе данных:Третья (?) Нормальная форма отношения

Message 
-------- 
idMessage (PK) 
Sender 
Recipient 
idObject 
Subject 

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

Пример: Допустим, что userB является продавцом (владельцем) продукта #1234 и userA является продавцом (владельцем) продукта #1000. Мы имеем следующую таблицу:

idMessage| Sender| Recipient | idObject| Subject 
________________________________________________ 
    1 | userA | userB | #1234 | size 
    2 | userB | userC | #1234 | discount 
    3 | userA | userB | #1000 | size 

По-видимому, idObject в таблице выше определяет продавец продукта. В каждом случае продавец должен быть либо в столбце «Отправитель», либо в столбце «Получатель». Дело в том, что [Отправитель] или/и [Получатель] не могут определить idObject, как мы можем видеть в приведенном выше примере. Таким образом, мы имеем 3NF, так как все неключевые столбцы функционально децентрализованы только и только для первичного ключа.

+0

Остерегайтесь того, что «поскольку все неключевые столбцы определяются только первичным ключом» (угадывая, что вы намеревались написать, поскольку то, что вы написали, не имеет смысла) не является обоснованным оправданием. Правильно было бы, что все неключевые столбцы * не-транзитивно * определяются * каждым * ключом * и находятся в 2NF *. – philipxy

ответ

1

Вы злоупотребляете термином «определяет».

Набор атрибутов определяет другой, когда значение подземелья для первого только когда-либо появляется с не более чем одним значением подземелья другого. Поскольку idObject может отображаться с несколькими значениями Sender и несколькими значениями Recipient, он не выполняет функционального определения ни одного из них.

Ваше описание и здравый смысл не предполагают наличие каких-либо функциональных зависимостей, отличных от тех, которые подразумеваются в idMessage, являющемся PK. Так что это в 3NF и BCNF.

Фактически, если я дам вам значение idObject, вы не можете сказать мне что-нибудь вообще о том, что эта таблица выглядит как, кроме того, что говорит о ее заголовке и idMessage, являющемся PK. Так что это в 5NF. (И DKNF.)

(Я не могу даже определить определение «определяет», что имеет смысл того, что вы пишете. Возможно, вы считаете владельца объекта, который должен быть вовлечен в «определение». вам потребовалось, чтобы либо отправитель, либо получатель сообщения его владелец объекта тогда всякий раз, когда появилось значение idObject, должно было бы быть одно значение, которое появляется в каждом подпоследователе (отправитель, получатель) как отправитель или получатель. Но это ограничение не является функциональной зависимости, и это не означает, что существует функциональная зависимость. Таким образом, отношение все равно будет в 3NF.)

+0

Вы правы. Я неправильно использовал термин «определяет». Спасибо за ваше разъяснение. – thanasissdr

1

Итак, вопрос должен быть, существует ли транзитивная функциональная зависимость? если да, то это не 3NF.

Не уверен, что если я полностью понимаю атрибут idObject, но если [idMessage] определяет [idObject] с помощью [Получатель] или [Отправитель], то мы имеем переходную функциональную зависимость, следовательно, это не стать 3NF. Если [idObject] определяется атрибутом [idMessage], то все неключевые атрибуты полностью зависят от первичного ключа [idMessage], и ​​это будет a 3NF.

Возможно, вы захотите добавить какое-то объяснение о том, что такое idObject? Надеюсь, это поможет.

+0

ОК, это более понятно, тогда похоже, что idObject определяет [Получатель], я бы не сохранил эти два в одной таблице, если вы хотите, чтобы они были 3NF, а другой способ иметь эту функциональность системы обмена сообщениями - иметь таблицу сообщений следующим образом: Message (idMessage, Sender, Subject) и еще одна таблица MessageRecipient (id, MessageID, Recipient, idObject) таким образом, что вы также сможете отвечать на сообщения, я нашел что-то здесь http://www.vertabelo.com/blog/technical-articles/database-model-for-a-messaging-system –

+0

и да, вы в первом случае я упомянул –

+0

Большое спасибо ... – thanasissdr

 Смежные вопросы

  • Нет связанных вопросов^_^