Да, вполне возможно иметь 2 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