#postgresql #database-design
Вопрос:
У меня есть эти три таблицы,
- меню
- пункт
- Категория
И взаимосвязь между всеми этими таблицами такова,
- Меню может содержать несколько пунктов и категорий. Таким образом, меню имеет отношение «один ко многим» с пунктом и категорией.
- Товар и категория имеют отношение «многие ко многим»
- Кроме того, ограничение, о котором я думаю, заключается в том, что элемент и категория могут быть подключены только в том случае, если они оба находятся в одном и том же меню.
В настоящее время я думаю применить первые два ограничения (один ко многим и многие ко многим) в базе данных и обработать 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, Нет, внешние ключи подойдут-попробуйте.