Вот несколько вариантов
- Все в одной таблице
- Общие атрибуты профиля в одной таблице, тип профиля специфичен для их собственных таблиц с ссылками внешнего ключа на общий профильтаблица
- Наследование
- Хранилище ключей-значений
Все в одной таблице
В этом варианте все полявсегда присутствуют независимо от типа профиля.Это слишком легко сделать в первый раз, так как вам нужно всего лишь перечислить все столбцы.Тем не менее, это действительно плохой дизайн, который в долгосрочной перспективе усложнит вашу жизнь, потому что ремонтопригодность и расширяемость плохие.Вы должны прочитать в базе данных нормальные формы и т. Д. Не делайте этого.
Основные таблицы профилей и зависящие от типа профиля детали в их собственных таблицах
В этом варианте вы создадите таблицу для всех профилей.Это будет включать в себя все общие атрибуты.Эта таблица гарантирует, что все идентификаторы находятся в одном и том же пространстве имен и каждый профиль имеет уникальный идентификатор.Для каждого типа профиля вы создадите новую таблицу, которая имеет ссылку внешнего ключа на главную таблицу профилей.Затем вы можете выбрать все профили занятости, используя внутреннее соединение в таблице профилей занятости и главной таблице профилей.Этот дизайн позволяет создавать ограничения для каждого типа профиля.Кроме того, этот дизайн позволяет вам иметь профили, которые являются профилями занятости и образования.Вы, вероятно, должны сделать это.
Наследование
Postges предоставляет возможность наследования таблиц.Вы можете использовать это, создав базовую таблицу для всех типов профилей, а затем создав дочерние таблицы для каждого типа профиля.Каждый тип профиля затем наследует все атрибуты, определенные в родительской таблице.С помощью наследования вы можете выбрать все профили, используя родительскую таблицу, и все профили занятости, используя таблицу профилей занятости.Если общие профили используют только общие атрибуты, они могут быть сохранены в родительской таблице.
Основным недостатком наследования в postgres является то, что родительская таблица и дочерние таблицы не разделяют одно и то же пространство имен.Вы не можете создать уникальное ограничение, которое охватывает все таблицы.Это означает, что вы должны убедиться, что идентификаторы глобально уникальны, например, хранить отдельную таблицу для идентификаторов профиля.
Вы должны подумать, если недостатки наследования имеют значение в вашей ситуации.Однако это разумный способ создания отдельных таблиц для всех типов профилей, если вы используете postgres, поскольку вам не нужно дублировать определения общих атрибутов.
Хранилище значений ключей
Вы также можете создать таблицу для общих атрибутов профиля и сохранить остальные атрибуты в (profile, attribute, value) -tuples.Сделав это, вы отбросите преимущества СУБД и вам придется реализовать всю логику в вашей программе.Не делай этого.