您认为哪种方式是定义1:1关系的最佳方式,例如配偶?
在我的实际数据库中,我有一张人员表,其中一些人将被归类为“联合”。与表中的其他人(因此该人将与原始人联合)。 “联合”'将用于确定每个人的付款。
我可以拥有像
这样的东西PERSON
------
Person_ID (PK)
Name
Phone
Joint_With_ID (FK)
其中Joint_With_ID将为null或包含与其关联的记录的Person_ID(并且该人的记录包含第一人的person_ID),但我并不热衷于故意为空。
或者我可以有两张桌子
PERSON PERSON_JOIN
------ -----------
Person_ID (PK) Joined_ID (PK)
Name Person_ID
Phone Joined_With_Person_ID
并且在PERSON_JOIN中为每对联合的人提供两条记录 即
Person_ID Joined_With_Person_ID
5 8
8 5
两种情况都提高了person1被记录为与person2联合的可能性,但没有记录person2与person1联合的记录。
我甚至可以在PERSON_JOIN中只有一条记录用于每次加入,并且在尝试查看一个人是联合的时候使用SQL来搜索这两个字段。但那太可怕了!
那么......最好的方法是什么?
答案 0 :(得分:0)
配偶关系通常不是1:1 - 并非每个人都有配偶。它更像是' 0或1'忽略一夫多妻制和一夫多妻制社会。有些但并非所有人都有配偶,有配偶的人一次最多只有一名配偶。 (记录谁是其配偶的另一个独立包包'蠕虫。)
因此,您的PERSON_JOIN
架构设计到目前为止是最好的。
答案 1 :(得分:0)
在我的实际数据库中,我有一张人的表,有些人会这样 被归类为联合'和桌子上的其他人一起(那个 因此,人将与原始人联合)。该 '联合作战'将用于确定每个人的[原文如此]付款。
在SQL数据库中执行此操作的常用方法是对ID号强加订单,并使用检查约束来保证订单。这假设元组{5,8}与元组{8,5}意思相同,并且它假定一个人不能与自己联合。这里要小心。
如果我有" 8与5结婚,5与8"结婚,我认为这些意思相同。但是" 8依赖于5"并不代表与#34相同的东西; 5是8"的依赖。
create table person_join (
person_id integer not null references person (person_id),
joined_with_person_id integer not null references person (person_id),
primary key (person_id),
check (person_id < joined_with_person_id)
);
如果您需要加入多个人,请将主键约束更改为
primary key (person_id, joined_with_person_id),
您可能需要一个额外的索引,因为您或多或少需要独立查询两个列。
create index on person_join (joined_with_person_id);
如果你需要知道是否有人&#34; 5&#34;有任何加入的人,你可以
select *
from person_join
where person_id = 5
or joined_with_person_id = 5;