1
2
我认为,对这种类型的关系强制执行无空和无重复会使模式定义方式比实际需要的更加复杂。即使允许为空,一个人仍有可能有多个配偶,或有冲突的记录,例如:
你需要引入更多的数据,比如性别(或者同性婚姻的“配偶号码”),以确保,例如,只允许一种类型的人有配偶。另一个人的配偶将由第一个人的记录决定。例如。:
|
2
1
首先,我会使用自动递增的ID,当然,某人可以有相同的名字。但是,我想你打算这么做,不会喋喋不休。然而,反对空值的论点究竟是如何进行的呢?我对null没有任何问题,我认为这是解决这个问题的合适方法。 |
3
1
我不知道为什么还没有人指出这一点,但事实上很容易确保一个人只有一个配偶,使用的模型与你在问题中提出的几乎相同。 我暂时不考虑使用名称作为主键(它可能会更改,而且重复的情况相当普遍,因此这是一个糟糕的选择),我还将忽略可能需要的历史跟踪(你可能想添加一个生效日期,这样你就知道他们是什么时候的配偶了——乔·塞尔科(Joe Celko)写了一些关于时间建模的好东西,但我不记得当时是哪本书中的).否则,如果我离婚并再婚,你会失去我在另一个时间有另一个配偶的机会——也许这对你来说并不重要。 此外,您可能希望将名称分为名、中名、姓、前缀、后缀等。
如果您希望配偶也出现在人员表中,那么您也可以为此添加一个FK。然而,此时您正在处理一个双向链接,这变得有点复杂。 |
4
0
好的,首先使用一个键而不是名称,也许是一个int种子。但为了防止一个人有多个配偶,只需在配偶表中为父母(name1)添加一个唯一索引。这将防止您两次插入相同的名称1。 |
5
0
好的,使用自动ID,然后使用检查约束。“Name1”列(只能是一个int ID)将被强制只有奇数编号的ID,而Name2只有偶数编号的ID。 然后为Column1和Column2创建唯一约束。 |
6
0
您需要一个person表和一个单独的“Partner\u Off”表来定义关系。
合作伙伴关闭(id、合作伙伴id、关系);
|
7
0
可以使用触发器强制执行约束。PostgreSQL已经 constraint triggers ,这是一种将约束计算推迟到事务中适当时间的特别好的方法。 数据库管理中的实际问题 ,第66-67页:
|