избыточный внешний ключ? - PullRequest
1 голос
/ 19 марта 2012

Я сейчас работаю над базой данных со следующими требованиями: Существуют учетные записи разных типов.У них могут быть разные планы оплаты в зависимости от типа.Все это похоже на иерархию с 2 уровнями.Например, если бы типами счетов были A и B, то планами платежей могли бы быть A1, A2, B1 и B2, где Ax действителен только для типа счета A и т. Д.

Пока что яПолучены следующие настройки: Таблица account_types с id и name .Таблица payment_plans с account_type_id и id , оба они являются частью PK.И таблица счетов с type_id и plan_id .Я думаю, это очевидно, что ссылки, что.

Моя проблема заключается в следующем: accounts.type_id является FK и accounts.type_id + accounts.plan_id это композитный ФК.Я не знаю, является ли это оптимальным решением. type_id является своего рода избыточным, поскольку он неявно определен plan_id , но только из-за ограничений, существующих в таблице payment_plans .Так что было бы лучше здесь?Я мог бы полностью избавиться от type_id , но тогда потребовалось бы еще одно объединение с таблицей payment_plans , чтобы определить тип учетной записи.

Спасибо за ваш вклад вавансовый.Предложения с совершенно другой структурой также приветствуются.; -)

1 Ответ

0 голосов
/ 19 марта 2012

У меня были бы эти таблицы:

  • account_types:
    • id: PK
    • name
  • payment_plans
    • id: PK
    • account_type_id: от FK до account_types
  • accounts
    • какие бы столбцы ни нужны аккаунту
  • accounts2payment_plans
    • account_id: от FK до accounts и часть PK
    • payment_plan_id: от FK до payment_plans и часть PK

Причина этого заключается в следующем:

  1. У каждого типа учетной записи может быть несколько планов платежей, поэтому в таблице payment_plans должна быть ссылка на таблицу account_type. С помощью этой ссылки определяется тип плана платежей.
  2. Каждая учетная запись может иметь несколько планов платежей, но каждый план оплаты может использоваться несколькими учетными записями, поэтому необходима таблица сопоставления accounts2payment_plans. Посредством сопоставления между учетной записью и планом платежей все типы учетных записей учетной записи определяются неявно.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...