СУБД Ref. Целостность: ребенок, у которого слишком много родителей?

У меня общий вопрос по дизайну. Рассмотрим эти 3 таблицы:

Table Restaurants:
    RID pk auto_increment
    etc...

Table Vacations:
    VID pk auto_increment
    etc...

Table Movies:
    MID pk auto_increment
    etc...

А теперь представьте, что мы хотим создать список «Что нужно делать после окончания COVID» из выбранных записей из этих трех разных таблиц. Список может содержать любое сочетание записей из этих таблиц. Тогда на ум приходит:

Table Todo:
   Type [ one of R, V, M ]
   ID [ the ID of the parent item ]

Но как бы вы обеспечили ссылочную целостность на этом предмете? То есть, как мы можем гарантировать, что при удалении ресторана из ресторанов он также исчезнет из Todo?

(Я знаю, как добиться этого с помощью триггеров; любопытно, есть ли комбинация сущностей, которые выполнят это с помощью чистой СУБД ref. Int.)

Спасибо!


person Yanay Lehavi    schedule 12.05.2020    source источник
comment
Возможно, вы захотите посмотреть stackoverflow.com/questions/4796535/shared-primary-key   -  person Progman    schedule 12.05.2020


Ответы (1)


Вы можете добавить столбцы внешнего ключа, допускающие значение NULL, в вашу todo таблицу для каждой имеющейся у вас целевой таблицы. Итак, ваша таблица будет выглядеть так:

Table Todo:
   RID fk (nullable)
   VID fk (nullable)
   MID fk (nullable)

Столбец type больше не нужен, так как вы можете проверить, какой столбец заполнен внешним ключом. Очевидно, вам нужно добавить ограничение CHECK, чтобы гарантировать, что должен быть установлен ровно один внешний ключ.

person Progman    schedule 12.05.2020