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

3

我正在 MSSQL 2008 中建模一个数据库。

我有四个表。

**User**
userID
userName

**NewsCategory**
newsCategoryID
newsCategoryName

**News**
newsID
newsText
newsCategoryID

**Subscription**
userID
categoryID

我知道在新闻和分类表之间应该有外键,但是订阅应该怎么办呢?即使不强制订阅,我是否应该在用户和订阅表之间建立外键关系呢?


1
“我在用户和订阅表之间是否应该建立外键,即使不强制要求订阅某些内容?” -- 是的。 - Denis de Bernardy
1
我认为这可能被视为多对多关系,其中Subscription是一个连接表? - johan
5个回答

7

是的,你应该使用外键。外键用于确保订阅是为已存在的用户创建的。外键并不意味着用户必须订阅某些内容。


2

是的,你应该有这个外键,因为它可以防止存在一个不映射到实际用户ID的订阅。

它作为你数据的限制。


2

Subscription 是一个多对多的链接表,“not mandatory” 表示该用户或用户/类别将没有行。

当您拥有一个或多个订阅时,外键是必需的,以强制执行数据完整性,这些订阅将成为一行或多行。

注意:在可选的父子类型关系中,FK列将是NULLable,以捕获“非强制性”。 在链接表中,通过行不存在来捕获此情况。


0

是的,您应该在用户和订阅表与订阅表之间添加外键。

外键约束用于验证向数据库添加错误信息。例如,在您的订阅表中,不应存在不在用户表中的用户ID,也应该有不在新闻类别表中的类别ID。即使您没有在用户界面端进行验证,这些约束也会为您执行验证。


0

你已经得到了一些好的答案。让我试着再补充一下。

一个订阅需要有订阅者和类别。因此,这两列都不应该允许为空。防止空值并不等同于外键约束。

如果在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) REFERENCES CATEGORIES(categoryid)

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

通过创建外键约束,您并不是在告诉数据库引擎:确保在表中插入一行。这是完全可能的(尽管不寻常),表根本没有任何行。外键约束只是确保在表中插入的任何值都有一个对应的那个表中的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接