Проектирование базы данных: Могу ли я сделать столбец в таблице допускает только одно 'true' для некоторых определенных строк и другие false для тех же конкретных строк - PullRequest
1 голос
/ 02 января 2012

Постановка проблемы - [Бизнес] 1 --- * [Филиал] Бизнес должен иметь один или несколько филиалов. Только одна ветвь может быть основной ветвью.

У меня на уме два дизайна

  1. [ Таблица филиалов ] - {id, BusinessID (FK), Имя и т. Д., IsMainBranch }
  2. [ Таблица филиалов ] - {id, BusinessID (FK), Имя и т. Д.}, [ Таблица MainBranch ] - {BranchID (PK, FK), BusinessID (FK) }.
  3. [ Бизнес-таблица ] - {id, name, mainbranchid }, [ Таблица филиалов ] - {id, BusinessID (FK), Name и т. Д. }

Проблема с # 1 - Чтобы установить ограничение на IsMainBranch, я должен использовать триггеры, которые могут не синхронизироваться последними.

Проблема с # 2 - бит сложен для доступа к данным в EF.

Проблема с # 3 - Не думайте, что это хороший дизайн.

Я использую EF 4.1 в качестве ORM и не хочу усложнять, какой дизайн мне выбрать. Пожалуйста, предложите, если есть лучший / альтернативный способ для того же.

Ответы [ 3 ]

6 голосов
/ 02 января 2012

В SQL Server 2008+ вы можете использовать отфильтрованные индексы

В вашей таблице Branch просто есть флаг IsMainBranch. Затем создайте уникальный отфильтрованный индекс: это позволит только одну строку, где IsMainBranch= 1 на бизнес.

Таблица филиалов:

id (PK)
BusinessID (FK)
Name
...
IsMainBranch 

Тогда

CREATE UNIQUE INDEX IX_MainBranch 
        ON Branch(BusinessID) 
        WHERE IsMainBranch = 1;

Это дает

  • более простая структура таблицы
  • без триггеров
  • движок БД навязывает вам это
  • нет круглых ФК (нет MainBranchID в таблице Business)

Также см .:

0 голосов
/ 02 января 2012

Я бы выбрал номер 3, создаю mainBranchId в бизнес-таблицах.

1) это гарантирует, что в любой момент времени в каждой компании будет не более одного основного филиала.(это может произойти в двух других проектах)

2) вам не нужно создавать дополнительную таблицу, которая является копией таблицы ветвлений (это то, что вы будете делать во втором проекте)

0 голосов
/ 02 января 2012

Каждая "спутниковая" ветвь будет иметь основную ветвь, верно?Так почему бы не иметь поле "основная ветка".Если идентификатор ветви == основная ветвь, то является главной ветвью.В противном случае ссылается на основную ветвь.

Вы должны не иметь столбец "isMainbranch".

Возможно, столбец "Тип ветви"ОК: типы могут включать «основной», «спутниковый», «киоск банкомата» и т. Д. Но логическое «isMainBranch»?№

ИМХО ...

...