Разработка модели / схемы SQL, проверка ограничений, FK или редизайн таблицы? - PullRequest
1 голос
/ 02 февраля 2012

У меня есть следующие модели (упрощено, если пропустить все остальные поля с акцентом на идентификаторы первичного ключа):

[invoice]
 invoice_id
 customer_id
 invoice_description

[customer]
  customer_id
  company_id
  customer_name

[company]
 company_id
 company_name

[strategy]
 strategy_id
 strategy_descripton

Компания имеет много клиентов, которые, в свою очередь, могут иметь много счетов, принадлежащих этому клиенту.

Хотя это и не показано выше, я также хотел бы иметь список стратегий, которые принадлежат компании (и только одной компании).

Мне бы хотелось, чтобы клиент, счет и компания могли определить «стратегию по умолчанию», которая ссылается на стратегию компании, к которой они принадлежат.

Я знаю, что мог бы добавить дополнительное поле FK с именем Strategy_id в каждую таблицу (счет-фактура, клиент и компания), но как я могу гарантировать, что в случае внесения изменений (кто-то пытается перенести стратегию в другую компанию), мы не в конечном итоге счет или клиент указывает на стратегию, которая входит в список стратегий другой компании?

Как бы я справился с этим - нужно ли мне проверять все это в бизнес-логике или использовать проверочные ограничения, или это можно сделать с помощью редизайна таблицы и внешних ключей?

Большое спасибо заранее,

Chris

Ответы [ 2 ]

0 голосов
/ 04 февраля 2012

Если я правильно понимаю, вы хотите, чтобы у каждой компании было много стратегий, каждая стратегия принадлежала одной компании (таким образом, 1:n отношение между компанией и стратегией). А также одна стратегия по умолчанию для каждой компании, которая также является стратегией по умолчанию для всех ее клиентов и их счетов.

Вы можете определить эти ограничения как ограничения внешних ключей, добавив еще одну таблицу [company_default_strategy], которая находится в 1:1 отношении к таблице [strategy] (некоторые стратегии по умолчанию):

[invoice]
 invoice_id     PK
 customer_id    FK  to  customer(customer_id)
 invoice_description

[customer]
 customer_id    PK
 company_id     FK  to  company(company_id)
 customer_name

[company]
 company_id     PK
 company_name

[strategy]
 strategy_id    PK
 company_id     FK  to  company(company_id)
 strategy_descripton

[company_default_strategy]
 company_id     PK, FK1 
 strategy_id    FK1
   FK1 (strategy_id, company_id)  to  strategy(strategy_id, company_id)
0 голосов
/ 02 февраля 2012

Не возражаете, если клиент или счет, принадлежащий компании, изменят свою стратегию, если компания изменит свою стратегию.

Например: если компания1 имеет стратегию1. У него есть customer1, customer2 (с накладной1). Затем, если компания1 меняет свой счет на стратегию2, все ли в порядке, если customer1, customer2 и invoice1 принадлежат стратегии2 или стратегии1.

Если это не имеет значения, сделайте:

  • Добавить ограничение в таблицу компаний. Чтобы проверить стратегию клиента / счета, найдите родительскую компанию и проверьте ее стратегию.

В противном случае, если это имеет значение:

  1. Добавить ограничение в таблицу компании и не допускать его изменения, если компания принадлежит дочернему клиенту / счету (проверьте, существуют ли они).
  2. Установите ограничение для каждой таблицы, как вы упоминали выше.

Если вы хотите получить более конкретный ответ, вам нужно уточнить.

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