Лучший способ обеспечить соблюдение этого ограничения целостности данных? - PullRequest
4 голосов
/ 07 октября 2010

У меня есть 3 таблицы (назовем их Foo, Bar и Baz.

Таблицы:

Foo

  • FooId

Bar

  • BarId
  • FooId

Баз

  • Баз ID
  • BarId
  • AnotherValue

Очевидно, что внешние ключи делают так, чтобы каждый Баз ассоциировался с Баром и, следовательно, ассоциировался с Foo. Теперь я хочу убедиться, что для каждого набора Баз с тем же«AnotherValue» - все связанные Foo уникальны

Например, если у меня было

Foos (1, 2, 3)
Bars ((10, 1), (11, 1), (12, 1), (13, 2))
Bazs ((100, 10, "a"), (101, 10, "b"), (102, 13, "a"), (104, 11, "b"))

, это должно быть заблокировано, потому что Baz 104 и baz 101 оба имеют AnotherValue "b" и Foo 1.


Опции, о которых я думал (в порядке моих текущих предпочтений)

Индексированное представление

Я мог бы создать представление над этими тремятаблиц и поместите уникальный индекс в два столбца

Вычисляемый столбец

Добавьте FooId в качестве вычисляемого столбца в Baz. Затем добавьте индекс для AnotherValue и FooId.

Проверка ограничений

Я почти уверен, что это можно добавить и будет работать.Я не очень часто использовал проверочные ограничения, и я не уверен, что это лучший способ сделать это.

Триггер

Мне это просто кажется уродливым.

Ответы [ 2 ]

1 голос
/ 23 мая 2011

Я не уверен, что полностью понимаю вопрос, но похоже, что вы хотите перенести FooId в таблицу Baz и добавить альтернативный ключ (уникальное ограничение) в FooId, AnotherValue.

Baz
•BazId
•BarId
•FooId
•AnotherValue
0 голосов
/ 07 октября 2010

Просто повторяем, используя разные имена:

Parent (ParentID) 
       (1, 2)
Child (ChildID, ParentID) 
       ((10, 1), (11, 1), (13, 2))
GrandChild (GCID, ChildID, GCAndParentVal) 
       ((100, 10, "a"), (101, 10, "b"), (102, 13, "a"), (104, 11, "b"))

Может быть, у вас есть это поле в другой таблице с parentID и baz.anotherValue вместо включения его в таблицу с childID?

как это:

Parent (ParentID) 
       (1, 2)
Child (ChildID, ParentID) 
       ((10, 1), (11, 1), (13, 2))
GrandChild (GCID, ChildID, ...) 
       ((100, 10, ...), (101, 10, ...), (102, 13, ...), (104, 11, ...))
AnotherChildValue (ParentID, AnotherVal)
       ((1, "a"), (1, "b"), (2, "a"), (1, "b"))
...