Создание схемы SQL (postgresql) - PullRequest
0 голосов
/ 27 марта 2011

У меня проблемы с созданием схемы для проекта PostgreSQL.

Это для сайта социальной сети, если есть профиль, и каждый профиль представлен в трех вариантах: общие, образовательные и профили занятостипоэтому каждому профилю требуются разные атрибуты ... как мы можем сделать все это в одной таблице?

create type ProfileTypeValue as enum
   ('generic', 'education', 'employment');

create Profiles (
  id    integer
  type  ProfileTypeValue
  ....?
  primary key (id)
);

, потому что, например, если это профиль образования, то нам нужно иметь название учреждения и т. д., или если этопрофиль занятости, тогда нам нужен атрибут имени работодателя и т. д.

Лучше всего просто иметь 3 разные таблицы, по 1 для каждого профиля Тип, не знаю, возможно ли это ... но я чувствую, что мне нужноиметь оператор if, говорящий, является ли это профиль, включает эти атрибуты или, если это профиль, включает эти атрибуты и т. д.

Ответы [ 2 ]

3 голосов
/ 27 марта 2011

Вот несколько вариантов

  1. Все в одной таблице
  2. Общие атрибуты профиля в одной таблице, тип профиля специфичен для их собственных таблиц с ссылками внешнего ключа на общий профильтаблица
  3. Наследование
  4. Хранилище ключей-значений

Все в одной таблице

В этом варианте все полявсегда присутствуют независимо от типа профиля.Это слишком легко сделать в первый раз, так как вам нужно всего лишь перечислить все столбцы.Тем не менее, это действительно плохой дизайн, который в долгосрочной перспективе усложнит вашу жизнь, потому что ремонтопригодность и расширяемость плохие.Вы должны прочитать в базе данных нормальные формы и т. Д. Не делайте этого.

Основные таблицы профилей и зависящие от типа профиля детали в их собственных таблицах

В этом варианте вы создадите таблицу для всех профилей.Это будет включать в себя все общие атрибуты.Эта таблица гарантирует, что все идентификаторы находятся в одном и том же пространстве имен и каждый профиль имеет уникальный идентификатор.Для каждого типа профиля вы создадите новую таблицу, которая имеет ссылку внешнего ключа на главную таблицу профилей.Затем вы можете выбрать все профили занятости, используя внутреннее соединение в таблице профилей занятости и главной таблице профилей.Этот дизайн позволяет создавать ограничения для каждого типа профиля.Кроме того, этот дизайн позволяет вам иметь профили, которые являются профилями занятости и образования.Вы, вероятно, должны сделать это.

Наследование

Postges предоставляет возможность наследования таблиц.Вы можете использовать это, создав базовую таблицу для всех типов профилей, а затем создав дочерние таблицы для каждого типа профиля.Каждый тип профиля затем наследует все атрибуты, определенные в родительской таблице.С помощью наследования вы можете выбрать все профили, используя родительскую таблицу, и все профили занятости, используя таблицу профилей занятости.Если общие профили используют только общие атрибуты, они могут быть сохранены в родительской таблице.

Основным недостатком наследования в postgres является то, что родительская таблица и дочерние таблицы не разделяют одно и то же пространство имен.Вы не можете создать уникальное ограничение, которое охватывает все таблицы.Это означает, что вы должны убедиться, что идентификаторы глобально уникальны, например, хранить отдельную таблицу для идентификаторов профиля.

Вы должны подумать, если недостатки наследования имеют значение в вашей ситуации.Однако это разумный способ создания отдельных таблиц для всех типов профилей, если вы используете postgres, поскольку вам не нужно дублировать определения общих атрибутов.

Хранилище значений ключей

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

1 голос
/ 27 марта 2011

PostgreSQL поддерживает наследование на уровне таблиц.Вы можете создать таблицу профиля в качестве родительской таблицы с общими атрибутами, а затем разделить дочерние таблицы для образования и занятости только с атрибутами, относящимися к этим категориям

Ознакомьтесь с документацией PostgreSQL здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...