数据库关系1:1 vs 1:0..1

时间:2011-01-20 14:13:22

标签: c# sql sql-server database database-design

我正在努力学习这些关系。这是正确的,因为我在下面显示:

1)我只需要让父母的身份密钥也是孩子的身份密钥,就会有 1:0..1 关系?

2)要使其 1:1 ,我在父表中添加一个FK,连接两个标识列?

这就是它的全部吗?如果我的措辞不准确/正确,请纠正我。

1:0..1

客户(Id {PK,Identity},姓名)

CustomerAddress (CustomerId {PK,FK,Identity},StreetName)

FK_CustomerAddress_Customer (CustomerId,Id)

1:1

客户(Id {PK,FK,Identity},姓名)

FK_Customer_CustomerAddress (Id,CustomerId)

CustomerAddress (CustomerId {PK,FK,Identity},Streetname)

FK_CustomerAddress_Costumer (CustomerId,Id)


EDIT1:

我相信上面两个都是错的,解决方案是这样的:(?)

1:0..1

客户(Id {PK,身份} ,姓名)

CustomerAddress (CustomerId {PK,FK,UNIQUE} ,StreetName)

FK_CustomerAddress_Customer (CustomerId,Id)

3 个答案:

答案 0 :(得分:4)

两个表之间的1:1关系意味着每个表中的每个元组都映射到另一个表中的一个元组。这更正式地称为双射。这是SQL的一个限制,对于大多数实际来说,在SQL数据库中实际上无法实现双射。这是因为SQL要求每个表单独更新,因此除非暂时禁用其中一个约束,否则无法更新两个这样的表。

1:0/1关系也称为投射(你的第一个例子)。抛出是SQL样式的“FOREIGN KEY”约束的标准行为,假设不允许空值。约束在关系的一侧始终是可选的。

注意:IDENTITY属性与您的示例无关。这是定义关系的关键和外键约束。

答案 1 :(得分:3)

外键只能指向一个方向;如果你指出两种方式,你就永远不能插入一行,因为插入只能在一个表上运行。

因此,您为1:0,1列出的解决方案通常用于两种情况。据我所知,SQL Server无法在1:1约束中提供第二个。

答案 2 :(得分:0)

关于这个主题的有趣读物:

ON POFN* AND POOD* - TWO COMPLEMENTARY DATABASE DESIGN PRINCIPLES with Fabian Pascal, Hugh Darwen and David McGoveran

  

我总是教导失去这个   约束[圆形FK]作为另一种   正常化的优势,而不是   它的问题!