Как я должен сделать это (бизнес-логика) в Sql Server? Ограничение? - PullRequest
3 голосов
/ 19 апреля 2010

Я хочу добавить в таблицу какое-то ограничение бизнес-логики, но не знаю, как и где.

У меня есть таблица со следующими полями.

  • ID INTEGER IDENTITY
  • HubId INTEGER
  • CategoryId INTEGER
  • IsFeatured BIT
  • Foo NVARCHAR (200)

и т.д.

Так что я хочу, чтобы у вас был только один признак для каждого hubId + categoryId.

eg.
1, 1, 1, 1, 'blah'  -- Ok.
2, 1, 2, 1, 'more blah' -- Also Ok
3, 1, 1, 1, 'aaa' -- constraint error
4, 1, 1, 0, 'asdasdad' -- Ok.
5, 1, 1, 0, 'bbbb' -- Ok.

etc.

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

Возможно ли это?

1 Ответ

3 голосов
/ 19 апреля 2010

Вы используете ограничение базы данных для защиты данных. Для меня бизнес-логика - это вычисления, сложная логика или построчная обработка: не разновидность уникального ограничения

В этом случае:

  1. вы можете использовать триггер для проверки после вставки
  2. определить индексированное представление фильтрации IsFeatured = 1 для HubId, CategoryId, IsFeatured
  3. используйте отфильтрованный индекс , поскольку у вас есть SQL Server 2008 (который похож на индексированное представление)

Я бы лично выбрал вариант 3

PS: где вы упомянули articleID?

И этот вопрос: Объединение ограничений UNIQUE и CHECK

Edit:

По сути, вы бы сделали

CREATE UNIQUE INDEX IX_Foo ON Mytable (HubId, CategoryId) WHERE IsFeatured = 1

Таким образом, теперь проверяется уникальность (HubId, CategoryId) только для подмножества данных, где IsFeatured = 1

...