我正在努力学习这些关系。这是正确的,因为我在下面显示:
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)
答案 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)
关于这个主题的有趣读物:
我总是教导失去这个 约束[圆形FK]作为另一种 正常化的优势,而不是 它的问题!