Вариантов немного, у каждого есть свои преимущества и недостатки.То, как вы это разработали, определенно является одним из возможных подходов.Преимущество заключается в том, что вы полностью используете родные технологии БД (особенно FK).Недостаток в том, что у вас получается сложный дизайн.
Другой вариант, который мне приходит в голову, это то, что вы можете построить только один объединяющий стол in_promotion
с тремя атрибутами:
+fk_id_promotion : integer
+fk_id_prmotionRecipient : string
+promotionRecipientType
Второй на самом деле не настоящий ФК в понимании БД.С другой стороны, последний, вероятно, будет также FK для какого-то словаря, но я пропущу это на мгновение.
В этом подходе вы смешиваете FK для разных таблиц, в зависимости от типа, указанного в promoRecipientType.Вместо четырех таблиц у вас есть одна.
Преимущество такого подхода состоит в том, что вам легче следовать модели (до некоторой степени!), Но в итоге вы получаете решение, которое является менее эффективным (вы не можете простоВ случае таблиц вам необходимо читать эту информацию по отдельности и объединять ее на уровне приложения.Другим существенным недостатком является то, что он ограничивает ваш выбор типов ПК - они должны быть одинаковыми во всех таблицах для объектов, подлежащих повышению.
Вы также можете смешивать различные подходы или решать недостатки, упомянутые ранее, другими способами (вызывая дополнительные недостатки). Варианты практически бесконечны, и перечислить их все невозможно.
Со временем вы 'Вы узнаете, как лучше всего работать в конкретном случае.