在数据库中表示1:1关系的最佳方式是什么



您认为哪种方式是定义1:1关系(如配偶)的最佳方式?

在我的实际数据库中,我有一个人员表,其中一些人将被归类为与表中其他人"联合"(因此该人将与原始人联合)。"共同性"将用于确定每个人的付款。

我可以买一些类似的东西

PERSON
------
Person_ID   (PK)
Name
Phone
Joint_With_ID  (FK)

其中Joint_With_ID要么为null,要么包含与之联合的记录的Person_ID(并且该人的记录包含第一个人的Person_ID),但我不喜欢故意为null。

或者我可以有两张桌子

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

这两种情况都增加了人员1被记录为与人员2共同的可能性,但没有人员2与人员1共同的记录。

我甚至可以在PERSON_JOIN中为每个联接只保留一条记录,并在试图查看PERSON是joint和who时使用SQL来搜索这两个字段。但那太可怕了!

所以。。。什么是最好的方法?

在我实际的数据库中,我有一个人员表,其中有些人会与表中的其他人被归类为"共同"人因此将与原始人共同)。这个"共同性"将用于确定每个人的付款。

在SQL数据库中执行此操作的通常方法是对id号强制执行顺序,并通过检查约束来保证顺序。这假设元组{5,8}的含义与元组{8,5}相同,并且假设一个人不能与自己加入。这里要小心。

如果我说"8和5结婚,5和8结婚",我会认为这是同样的意思。但是"8是5的依赖项"并不意味着"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);

如果你需要知道人员"5"是否有任何加入人员,你可以

select *
from person_join
where person_id = 5 
   or joined_with_person_id = 5;

配偶关系通常不是1:1——并不是每个人都有配偶。它更像是从"0或1"到"0或",忽略了一夫多妻制和一夫多妻制社会。有些人(但不是所有人)有配偶,而那些有配偶的人一次最多有一个配偶。(记录谁是配偶的历史是另一种单独的"形式"。)

因此,到目前为止,您的PERSON_JOIN模式设计是两者中更好的。

最新更新