таблица истории и 2nf - PullRequest
       1

таблица истории и 2nf

1 голос
/ 30 сентября 2011

Таблица пользователей и таблица пользователей группы - это таблицы истории (их нельзя переместить в архивные таблицы, поскольку это может привести к путанице с внешними ключами, связанными с этими таблицами. Если пользователь группы создал сообщение и покинул группу, сообщение все еще должно существовать и т. Д.). )

Пользователи

Имя пользователя
Дата начала
ключ (имя пользователя, дата начала)

Группа пользователей

Название группы
Имя
Дата начала
Дата начала группы
Первичный ключ (имя группы, имя пользователя, дата начала группы)
Внешний ключ (имя пользователя, дата начала)

Согласно 2NF, любое неключевое поле не может быть фактом о подмножестве ключа. В этом случае имя пользователя является частью составного ключа, а дата начала - это факт о имени пользователя, поэтому эта таблица не в 2NF.

Так будет ли исправление включать дату начала как часть ключа?

Ответы [ 2 ]

2 голосов
/ 01 октября 2011

Дата начала - факт о пользователе

Не это не так. Дата начала не может быть определена именем пользователя в вашей модели, потому что (имя пользователя, дата начала) является ключевым - имя пользователя и дата начала вместе необходимы для идентификации строки в таблице пользователей.

1 голос
/ 30 сентября 2011

Возможно, PK группы пользователей неверен, поскольку для уникальной идентификации пользователя требуется комбинация UserName и StartDate. Таким образом, если «Джон» (первый) присоединился к 2011-09-01, а «Джон» (второй) присоединился к 2011-09-10, то ПК пользователей вашей группы не позволяет им присоединиться к одной группе. PK группы пользователей должен включать в себя как имя пользователя, так и дату начала, поскольку именно эта комбинация уникально идентифицирует пользователя.

Вот почему люди используют столбцы «ID»; если бы у вас был столбец Users.ID, то вы использовали бы этот простой ключ в FK в группах Users. Составные первичные ключи, которые сами используются в качестве внешних ключей в других таблицах, как правило, являются проблематичными (для таких случаев, как этот), и суррогат, такой как столбец идентификатора, делает проект БД более простым.

Вероятно, у вас также должна быть таблица Group, а Group Users.Group Name должна быть FK для этой таблицы. Немного удивительно, что в таблице Group Users и в таблице Users нет «даты отписки». Или вы можете предпочесть флаг «в настоящее время подписан», но в целом дата также полезна.

...