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