表有两个外键指向另一个表的同一列

时间:2018-05-10 19:55:11

标签: database-design

我想知道从设计的角度来看是否可能或理想的是有一个带有2个外键的表,每个外键指向另一个表的同一个字段。表<class 'dict'>有两个FK引用表Case的PK的字段(每个案例有两个客户端)

Client

1 个答案:

答案 0 :(得分:0)

是的,完全有可能有2个FK,每个FK指向另一个表的同一个字段。我会说这很不寻常,可能是设计没有正确规范化的症状。考虑

  

每个案例都有两个客户

我怀疑是过度简化了。这两个客户是否具有不同的角色?即使完全成熟的案例中只有2个客户,也许你只是逐个发现它们? (因此,您首先要记录case,然后再添加party1,稍后再添加party2。)双方是否可能是同一个客户?

正如@AndreasT暗示的那样,一个更常见的设计是:

client table:  -- as you have

case table:
----------------
PK: case_id
    other stuff about the case, start date, etc

party-case-role
----------------
PK: { case_id(FK case table)
    { party(FK client table client_id)
    { role

role可能是party1, party2, witness, consulted_expert, guardian, carer, ...(取决于您的案例)

这种风格的数据结构被称为'ppr' - 人 - 党 - 角色,在您正在处理的客户/客户/供应商/代理商之间存在许多交叉链接的行业中很常见 - 在保险或法律方面案例,例如。

对于要返回party1的查询,party2加入案例详细信息(根据您的评论请求)(未经测试)

SELECT case.*, p1.first_name, p1.last_name, p2.first_name, p2.last_name
FROM case
INNER JOIN (SELECT * FROM party-case-role WHERE role = 'party1' AS ppr1)
        ON case.case_id = ppr1.case_id
INNER JOIN client AS p1 ON ppr1.party = p1.client_id
INNER JOIN (SELECT * from party-case-role WHERE role = 'party2' AS ppr2)
        ON case.case_id = ppr2.case_id
INNER JOIN client AS p2 ON ppr2.party = p2.client_id