数据库:一对多(或一对无)关系

时间:2011-05-31 11:49:14

标签: sql sql-server

我在MSSQL 2008中建模数据库。

我有4张桌子。

**User**
userID
userName

**NewsCategory**
newsCategoryID
newsCategoryName

**News**
newsID
newsText
newsCategoryID

**Subscription**
userID
categoryID

我知道我应该在News和Category表之间有外键。但是我应该怎么做supscriptions?我是否应该在用户和订阅表之间有一个外键,虽然它不是必须订阅的东西?

5 个答案:

答案 0 :(得分:7)

是的,你应该。外键用于确保为现有用户创建订阅。外键并不意味着用户订阅某些内容。

答案 1 :(得分:2)

是的,您应该拥有此外键,因为它会阻止未映射到真实用户ID的订阅。

它充当您数据的约束。

答案 2 :(得分:2)

Subscription是一个链接(多个)表,“非强制”表示该用户或该用户/类别将 no 行。

执行具有一行或多行订阅时,需要使用外键来强制执行数据完整性。

注意:在可选的父子类型关系中,FK列将为NULL以捕获“非强制”。在链接表中,这是由行不存在

捕获的

答案 3 :(得分:0)

是的,您应该使用Subscription表在User和SubCription表之间添加外键。

外键约束用于验证向数据库添加错误信息。例如,在您的Subscription表中,不应该有User表不在User表中,并且应该有不在NewsCategory表中的CategoryID。即使您未在用户界面端进行验证,这些约束也将为您进行验证。

答案 4 :(得分:0)

你已经得到了一些好的答案。让我尝试添加另一个。

SUBSCRIPTION需要订阅者和类别。因此,这些列中的每一列都不应允许空值。防止空值与外键约束不同。

如果用户在USERS表中不存在,也应该无法在SUBSCRIPTIONS中插入行;如果CATEGORIES表中尚不存在类别,则无法在SUBSCRIPTIONS中插入行。要强制执行这些规则,您的SUBSCRIPTIONS表需要两个外键约束:

ALTER TABLE SUBSCRIPTIONS ADD CONSTRAINT FK_SUBSCRIPTIONS_USERS FOREIGN KEY(userid)REFERENCES USERS(userid) ALTER TABLE SUBSCRIPTIONS ADD CONSTRAINT FK_SUBSCRIPTIONS_CATEGORIES FOREIGN KEY(categoryid)参考类别(categoryid)

当您在表上创建外键约束时,您实际上是对数据库引擎说:确保插入到表中的任何值已经存在于中< / em>其他表格。顺便说一句,要创建约束的要求是唯一约束必须对 表中引用的列有效;通常,的引用列表将是 表的主键。

通过创建外键约束,您对数据库引擎说:确保将行插入表中。很有可能(虽然这很不寻常)这个表中没有任何行。外键约束只是确保 插入 表中的任何值都在 表中具有对应项。