Таблица с двумя внешними ключами, указывающими на тот же столбец другой таблицы - PullRequest
0 голосов
/ 10 мая 2018

Интересно, возможно ли или идеально с точки зрения дизайна иметь таблицу с 2 внешними ключами, каждый из которых указывает на одно и то же поле другой таблицы. Таблица Case имеет два поля, которые являются FK, ссылающимися на PK таблицы Client (В каждом случае есть два клиента)

client table:  
------------------
PK:client_id
   first_name
   last_name

case table:  
------------------
PK:case_id
   party1 (client_id)
   party2 (client_id)

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Да, вполне возможно иметь 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
0 голосов
/ 11 мая 2018

Если то ограничение, что в деле о консультировании есть только две стороны на самом деле , распространяется на всех дел, то нет веских оснований делать это по-другому.Если вы можете получить отношение один к более чем двум, вы должны сделать это отношение отдельной таблицей, например, rel_cases_clients: (ID, FK_Case, FK_Client).Это также немного лучше в отношении нормализации данных.

Как правило, наличие большого количества внешних ключей в вашей таблице не представляет никакой проблемы, и их обычно очень много.Но имейте в виду, что такие отношения обычно означают больше работы в ваших запросах.(JOIN)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...