Определите условное отношение «многие ко многим» в Postgresql

#postgresql #database-design

Вопрос:

У меня есть эти три таблицы,

  • меню
  • пункт
  • Категория

И взаимосвязь между всеми этими таблицами такова,

  1. Меню может содержать несколько пунктов и категорий. Таким образом, меню имеет отношение «один ко многим» с пунктом и категорией.
  2. Товар и категория имеют отношение «многие ко многим»

erd

  1. Кроме того, ограничение, о котором я думаю, заключается в том, что элемент и категория могут быть подключены только в том случае, если они оба находятся в одном и том же меню.

В настоящее время я думаю применить первые два ограничения (один ко многим и многие ко многим) в базе данных и обработать 3-е ограничение на стороне приложения.

Есть ли лучший способ в postgres или любой другой базе данных определить этот тип условного ограничения? Если да, то существует ли для этого отраслевой термин?

Ответ №1:

Не уверен, имеет ли это смысл с точки зрения управления рестораном, но соответствует ограничениям, описанным в вопросе.

 -- Menu MEN exists.
--
menu {MEN}
  PK {MEN}
 
 -- Item ITM is on menu MEN.
--
item {ITM, MEN}
  PK {ITM}
  SK {ITM, MEN}
 
 -- Category CAT is listed on menu MEN.
--
category {CAT, MEN}
      PK {CAT}
      SK {CAT, MEN}
 
 -- Item ITM, from menu MEN, is in category CAT
-- from the same menu.
--
item_category {ITM, CAT, MEN}
           PK {ITM, CAT}

FK1 {ITM, MEN} REFERENCES item {ITM, MEN}
FK2 {CAT, MEN} REFERENCES category {CAT, MEN} 
 

Примечание:

 All attributes (columns) NOT NULL

PK = Primary Key
AK = Alternate Key   (Unique)
SK = Proper Superkey (Unique)
FK = Foreign Key
 

Комментарии:

1.Не уверен, как это приведет к тому, что элемент и категория будут находиться в одном и том же меню FK1 {ITM, MEN} REFERENCES item {ITM, MEN} FK2 {CAT, MEN} REFERENCES category {CAT, MEN} , Нужно ли для этого добавлять дополнительные проверки?

2. @rakib, Нет, внешние ключи подойдут-попробуйте.