2011-05-31 134 views
3

Im在MSSQL 2008中建模数据库。数据库:一对多(或一对多)关系

我有4个表。

**User** 
userID 
userName 

**NewsCategory** 
newsCategoryID 
newsCategoryName 

**News** 
newsID 
newsText 
newsCategoryID 

**Subscription** 
userID 
categoryID 

我知道我应该在新闻和类别表之间有外键。但是我应该如何处理这些supscriptions?我是否应该在用户和订阅表之间有一个外键,但是不一定要订阅某些内容?

+1

“我应该在用户和订阅表之间有一个外键,但是不需要订阅某些内容吗?” - 是的。 – 2011-05-31 11:50:09

+1

我想也许这是被认为是多对多的关系,其中Subscription是一个联结表? – johan 2011-05-31 11:52:59

回答

7

是的,你应该。外键用于确保订阅是为现有的用户创建的。外键并不意味着,该用户应该被订阅的东西。

2

是的,你应该有这个外键,因为它会阻止现有的订阅不映射到真实的用户ID。

它充当您的数据约束。

2

Subscription是链路(多对多)表和“不是强制性的”是指将有没有行用于该用户或该用户/类别。

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

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

0

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

外键约束用于验证是否向数据库添加了错误信息。例如,在您的订阅表中,不应有不在User表中的用户标识,并且应该有不在NewsCategory表中的CategoryID。即使您没有在用户界面上进行验证,这些限制也会为您进行验证。

0

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

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

如果用户不存在于USERS表中,那么也不可能在SUBSCRIPTIONS中插入一行;如果该类别在CATEGORIES表中尚不存在,则应该不可能在SUBSCRIPTIONS中插入一行。为了执行这些规则,您的订阅表需要两个外键约束:

ALTER TABLE捐款增加约束FK_SUBSCRIPTIONS_USERS外键(用户ID)参考文献USERS(用户ID) ALTER TABLE捐款增加约束FK_SUBSCRIPTIONS_CATEGORIES外键(类别ID)参考文献类别(类别id)

当您创建一个表的外键约束,你实际上是说给数据库引擎:请确保获得任意值插入表中已经存在其他表。顺便说一下,要创建约束条件的一个唯一约束条件必须在表中引用的列上生效,即表;通常,参考列表将会是表的主键表。

通过创建一个外键约束,你不到数据库引擎:确保一排被插入表。这是很有可能的(尽管这很奇怪)这个表中没有任何行。外键约束只是确保确实将得到的任何值插入到这个表中有一个对应的表中。