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

时间:2014-10-11 14:42:38

标签: database relational-database entity-relationship

您认为哪种方式是定义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来搜索这两个字段。但那太可怕了!

那么......最好的方法是什么?

2 个答案:

答案 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;