Каков наилучший способ обеспечить соблюдение отношения «подмножество» с ограничениями целостности - PullRequest
4 голосов
/ 02 апреля 2011

Например, учитывая 3 таблицы:

  • брюхоногий
  • улитка
  • слизняк

и предполагая, что мы хотим применить это

  1. каждая строка в 'gastropod' имеет ровно одну соответствующую строку в 'улитке' или 'слизняке' (но не в обоих)
  2. каждая строка в 'слаге' имеет ровно одну соответствующую строкув 'gastropod'
  3. каждая строка в 'улитке' имеет ровно одну соответствующую строку в 'gastropod'

Каков наилучший способ настроить мою схему для применения этих ограничений?

Я предоставил один возможный ответ для postgres, и мне особенно интересны решения для postgres и Oracle, но также было бы интересно увидеть решения для других СУБД

EDIT
Для справки, ТАК вопросы из ответов / комментариев ниже, касающихся аналогичных проблем:

Ответы [ 12 ]

0 голосов
/ 02 апреля 2011

"@ Эрвин Я бы предпочел решения, которые не связаны с триггерами - у меня к ним патологическое отвращение."

Извините за новый ответ, не авторизован для добавления комментария к этому.

Насколько я могу видеть, вы можете избежать "просто использования отложенных ограничений" в вашем конкретном случае из-за характера ограничений, которые вы хотите наложить.Если это работает для вас, и вы удовлетворены, тогда все в порядке, не так ли?

Моя главная мысль - ограничения (как в: «любое мыслимое бизнес-правило, с которым вы можете столкнуться как дизайнер базы данных»), можетполучить сколь угодно сложным.Подумайте о базе данных по генеалогии, в которой вы хотите применить правило, согласно которому «ни один человек не может быть предком самого себя, В КАЧЕСТВЕ СТЕПЕНИ» (это мой любимый пример, потому что в конечном итоге он включает транзитивное замыкание и / или рекурсию).НЕТ СПОСОБА, чтобы вы могли заставить СУБД SQL применять такие правила без использования триггеров (или, кстати, без использования рекурсивного SQL внутри триггера).

Ни ваша СУБД, ни я, ни кто-либо ещеКвалифицированный в теории отношений, Фрейд будет заботиться о любых патологиях, которые у вас есть.Но, возможно, из-за этих патологий, о которых вы упомянули, было бы интересно наблюдать, что вы можете делать все, что захотите, без необходимости определять какие-либо триггеры, если вы используете разработанную мной СУБД (она поддерживает триггерный режим).вещи, но вы не обязаны прибегать к ним для обеспечения целостности данных).

0 голосов
/ 02 апреля 2011

Внешний ключ, ссылающийся на гастропода из слизняка и улитки с уникальным индексом в столбцах внешнего ключа, применяет правила 2 и 3. Однако правило 1 сложнее: - (

Единственный известный мне способ применения правила 1 - это написать некоторый код базы данных, который проверяет наличие улитки и пули на наличие строки.

Кстати - как вы собираетесь вставлять данные? В каком бы порядке вы ни делали это, вы нарушаете правило.

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