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

Sql 数据库:一对多(或一对无)关系,sql,sql-server,Sql,Sql Server,Im在MSSQL 2008中为数据库建模 我有四张桌子 **User** userID userName **NewsCategory** newsCategoryID newsCategoryName **News** newsID newsText newsCategoryID **Subscription** userID categoryID 我知道在新闻和分类表之间应该有外键。但是我该怎么处理这些监视呢?我是否应该在用户表和订阅表之间有一个外键,尽管订阅某些内容不是强制性的?是

Im在MSSQL 2008中为数据库建模

我有四张桌子

**User**
userID
userName

**NewsCategory**
newsCategoryID
newsCategoryName

**News**
newsID
newsText
newsCategoryID

**Subscription**
userID
categoryID

我知道在新闻和分类表之间应该有外键。但是我该怎么处理这些监视呢?我是否应该在用户表和订阅表之间有一个外键,尽管订阅某些内容不是强制性的?

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

是的,您应该拥有此外键,因为它将阻止不映射到真实用户id的订阅


它对您的数据起约束作用。

订阅是一个链接(多个)表,“非强制”表示该用户或该用户/类别没有行

当您有一行或多行订阅时,需要外键来强制执行数据完整性


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

是的,您应该使用订阅表在用户表和子描述表之间添加外键


外键约束用于验证是否向数据库中添加了错误信息。例如,在订阅表中,不应该有不在用户表中的userid,而应该有不在NewsCategory表中的CategoryId。这些约束将为您进行验证,即使您没有在用户界面端进行验证。

您已经得到了一些很好的答案。让我再补充一点

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

如果用户表中不存在该用户,则也不可能在订阅中插入行;如果类别在CATEGORIES表中不存在,则不可能在订阅中插入行。要实施这些规则,订阅表需要两个外键约束:

ALTER TABLE SUBSCRIPTIONS添加约束FK\U SUBSCRIPTIONS\U USERS外键(userid)引用用户(userid) ALTER TABLE SUBSCRIPTION添加约束FK_SUBSCRIPTION_CATEGORIES外键(categoryid)引用类别(categoryid)

在表上创建外键约束时,实际上是在对数据库引擎说:确保插入到此表中的任何值都已存在于另一个表中。顺便说一句,对要创建的约束的要求是,唯一约束必须对该表中引用的列有效;通常,该表的引用列将是该表的主键


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

“虽然订阅某些内容不是强制性的,但我是否应该在用户表和订阅表之间有外键?”--是的。我想这可能是一种多对多关系,连接表在哪里?