2011-05-31 4 views
3

Im моделирование базы данных в MSSQL 2008.База данных: От одного до многих (или от одного до одного) отношения

У меня есть 4 таблицы.

**User** 
userID 
userName 

**NewsCategory** 
newsCategoryID 
newsCategoryName 

**News** 
newsID 
newsText 
newsCategoryID 

**Subscription** 
userID 
categoryID 

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

+1

«Должен ли я иметь внешний ключ между таблицами пользователей и подписки, хотя не обязательно подписываться на что-то?» -- да. –

+1

Я думаю, что, возможно, это следует рассматривать как отношение многих ко многим, где Subscription - это таблица соединений? – johan

ответ

7

Да, вы должны. Внешний ключ используется для уверенности, что подписка создана для существующего пользователя. Внешний ключ не означает, что пользователь должен быть подписанным на что-то.

2

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

Он действует как ограничение ваших данных.

2

Subscription - ссылка (много-много) таблица и "не обязательно" означает, что будет нет строка для этого пользователя или этого пользователя/категории.

Иностранный ключ необходим для обеспечения целостности данных, когда у do есть подписки, которые будут содержать одну или несколько строк.

Примечание: В необязательных отношениях типа «родитель-ребенок» столбец FK будет NULLable для захвата «необязательно». В таблицах ссылок это фиксируется несоблюдением строки

0

Да, вы должны добавить внешние ключи между таблицами User и SubCription с таблицей подписки.

Внешние ключи предназначены для проверки правильности добавления неверной информации в базу данных. Например, в вашей таблице «Подписки» не должно быть идентификаторов пользователей, которые не находятся в таблице «Пользователь», и должны быть категории «категории», которые не указаны в таблице «NewsCategory». Эти ограничения будут делать валидацию для вас, даже если вы не выполните проверку на конце пользовательского интерфейса.

0

У вас есть хорошие ответы. Позвольте мне попытаться добавить еще один.

ПОДПИСЬ требует как абонента, так и категорию. Поэтому каждый из этих столбцов не должен допускать null. Предотвращение нулей - это не то же самое, что ограничение внешнего ключа.

Нельзя также вставлять строку в ПОДПИСКИ, если пользователь еще не существует в таблице USERS; и невозможно добавить строку в ПОДПИСКИ, если категория еще не существует в таблице КАТЕГОРИИ. Для того, чтобы обеспечить соблюдение этих правил ваша таблица ПОДПИСКИ требует двух внешних ключей:

ALTER TABLE ПОДПИСКИ ADD CONSTRAINT FK_SUBSCRIPTIONS_USERS FOREIGN KEY (идентификатор пользователя) СПРАВОЧНЫЙ ПОЛЬЗОВАТЕЛИ (USERID) ALTER TABLE ПОДПИСКИ ADD CONSTRAINT FK_SUBSCRIPTIONS_CATEGORIES FOREIGN KEY (CategoryID) Лит КАТЕГОРИИ (CategoryID)

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

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

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