C# 数据库关系1:1与1:0..1

C# 数据库关系1:1与1:0..1,c#,sql,sql-server,database,database-design,C#,Sql,Sql Server,Database,Database Design,我正在努力学习这些关系。正如我在下面所展示的那样,这是否正确: 1)我将通过简单地使父项的标识键同时也是子项的标识键来建立一个1:0..1关系 2)为了使它成为1:1,我在父表中添加了一个FK,连接两个标识列 就这些吗?如果我的措辞不准确,请纠正我 1:0..1 客户(Id{PK,Identity},Name) 客户地址(客户ID{PK,FK,Identity},街道名称) FK_客户地址_客户(客户Id,Id) 客户(Id{PK,FK,Identity},姓名) FK\u客户\u客户地址(I

我正在努力学习这些关系。正如我在下面所展示的那样,这是否正确:

1)我将通过简单地使父项的标识键同时也是子项的标识键来建立一个1:0..1关系

2)为了使它成为1:1,我在父表中添加了一个FK,连接两个标识列

就这些吗?如果我的措辞不准确,请纠正我

1:0..1
客户(Id{PK,Identity},Name)

客户地址(客户ID{PK,FK,Identity},街道名称)

FK_客户地址_客户(客户Id,Id)

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

FK\u客户\u客户地址(Id,CustomerId)

客户地址(客户ID{PK,FK,Identity},街道名称)

FK_客户地址_客户(客户Id,Id)


EDIT1:

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

客户(Id{PK,Identity},Name)

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


FK\U CustomerAddress\U Customer(CustomerId,Id)

外键只能指向一个方向;如果有两种方法,就永远无法插入行,因为插入一次只能对一个表进行操作


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

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

1:0/1关系也称为满射(您的第一个示例)。满射是SQL样式的“外键”约束的标准行为,假设不允许为null。约束在关系的一侧始终是可选的


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

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

我总是教你失去这个 约束[循环FKs]作为另一个约束 标准化的优势,而不是 有问题


我想知道你的意思是
1:0..1
(“一对零或一”)。是的,我的意思是,将进行编辑。如果你指的是客户而不是客户(设计服装的人),请修复表和字段的拼写。对于身份领域来说,ID是一个糟糕的选择。这将导致报告问题(报告不喜欢同名的多个列),并且很容易在连接中出错。改为使用tablenameId。支持可延迟约束的DBMS可以仅使用DDL强制执行1:1关系。如果必要的话,您可以使用触发器在SQL Server上获得相同的效果,但我现在已经太累了,不想再费劲了。是的,您可以使用延迟约束来实现。但是,可延迟约束只是一个可以临时禁用的约束,因此每次更新时都会违反该约束。换句话说,约束实际上根本不是作为声明性约束来实施的。在这方面,SQL对多表约束的支持非常有限。SQL Server中的解决方法是禁用约束,然后重新启用它。@dportas:“可延迟约束只是一个可以临时禁用的约束,因此每次更新时都会违反该约束”。这是一种看待它的方式。另一种方法是说一个可延迟约束是一个约束,它是在一系列SQL语句结束时检查的(在事务的结尾处,而不是中间的某个地方)。谢谢!我想我混淆了“唯一”和“身份”。。什么是真正的标识列?它可以做什么,或者用来做什么,而唯一列不能做什么?我在Management Studio中制作这些表时也遇到了问题。(1:0)我可以添加客户,但无法向CustomerAddress添加行…(?)哦..我必须删除CustomerAddressID上的标识,当然,然后我可以插入…请参见上面的EDIT1..这样正确吗?干杯!开始有意义了:)bretdog。。。别忘了接受答案。否则,你会名声扫地,完全得不到答案:POracle和PostgreSQL支持“延迟约束”的标准特性。你可以有效地拥有1:1的关系。你所说的“正常化的优势”是什么意思?一开始就不应该使用1:1吗?@bretddog:这不是我说的,而是休·达文说的。点击链接()并阅读文章!:)好啊我还是不明白。比我高一点。由于您使用了报价,您应该能够解释……)@bretddog:“你应该能够解释……;)”——我会尝试:)使用循环FK的缺点是,你会遇到类似的更新异常,例如,删除地址会导致客户被删除,在知道客户地址之前无法将其输入数据库,FWIW在我看来,
地址
客户
的属性,而不是两个实体之间的1:1关系。我明白了。很高兴知道关于删除等,我还没有尝试过。。这些桌子只是一个例子。我有一个大约有100列的表,在逻辑上它们是3个不同的类别。所以,这就是为什么把它分成3个表,其中两个表与第一个表的比例为1:1,感觉更容易管理的原因。我
1:1
1:0..1