我在MSSQL 2008中建模数据库。
我有4张桌子。
**User**
userID
userName
**NewsCategory**
newsCategoryID
newsCategoryName
**News**
newsID
newsText
newsCategoryID
**Subscription**
userID
categoryID
我知道我应该在News和Category表之间有外键。但是我应该怎么做supscriptions?我是否应该在用户和订阅表之间有一个外键,虽然它不是必须订阅的东西?
答案 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>其他表格。顺便说一句,要创建约束的要求是唯一约束必须对 表中引用的列有效;通常,的引用列表将是 表的主键。
通过创建外键约束,您不对数据库引擎说:确保将行插入此表中。很有可能(虽然这很不寻常)这个表中没有任何行。外键约束只是确保 插入 表中的任何值都在 表中具有对应项。