Обеспечение отношения многих ко многим - PullRequest
1 голос
/ 27 апреля 2020

enter image description here

У меня есть такая связь, где меню содержит хотя бы один элемент меню. Тем не менее, я думал, что если мы создадим меню, не будет в нем пункт меню, который нарушает отношение? Как мы можем предотвратить это из меню имеет 0 пунктов меню? Спасибо

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Обеспечение соблюдения этого ограничения в базе данных является сложной задачей. Проблема:

  • Невозможно вставить меню, потому что в этом меню нет пунктов меню (ваше новое состояние).
  • Невозможно вставить пункт меню, потому что меню не существует (очевидно из текущей модели данных).

Вместо этого добавьте флаг к menus, который дает информацию о наличии каких-либо пунктов меню. Тогда выбирайте только меню с предметами. Один из способов сохранения этой информации - использование триггеров. Тем не менее, вы также можете просто использовать представление:

create view v_menus as 
    select v.*
    from menus m
    where exists (select 1 from menuitems mi where mi.menu_id = m.menu_id);
1 голос
/ 27 апреля 2020

Нет простого способа сделать это. Вот несколько сложных способов:

  • Добавить необнуляемый внешний ключ от menu до menuitem, который указывает на один из элементов, связанных с меню.

    Недостатки: избыточность, которая должна поддерживаться каждой модификацией данных, лучше всего с триггером. Позаботьтесь о том, чтобы правильно обрабатывать взаимоблокировки.

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

  • Добавьте счетчик в каждое меню, которое отслеживает количество связанных пунктов меню. с курком. Как и в предыдущем решении, он будет надежно работать только с SERIALIZABLE транзакциями.

Часто это лучший выбор , а не для применения такого ограничения в базе данных для причины производительности. Ведь пустое меню не является катастрофой.

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