Несколько идентификаторов в поле. Postgresql

Итак, в настоящее время я работаю с системой баз данных, где пользователь может зарегистрироваться, войти в систему и обновлять свои данные в любое время. База данных включает 5 ролей:

1. Public
2. Member
3. Moderator
4. Coordinator
5. Admin

Я хочу иметь возможность назначать несколько ролей своим пользователям. Например, администратор также может быть участником. Поэтому в базе данных должно отображаться:

User_id    |    Role_ID
------------------------
user1      | 2, 5

^ можно ли добавить многозначные идентификаторы в postgresql?

2 ответа

Решение

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

Создайте одну таблицу: role_names и другие роли, вот так:

CREATE TABLE role_names
(
  id serial NOT NULL,
  name text NOT NULL,
  CONSTRAINT role_names_pkey PRIMARY KEY (id),
  CONSTRAINT role_names_name_key UNIQUE (name)
);

CREATE TABLE roles
(
  user_id bigint NOT NULL,
  role_id bigint NOT NULL,
  CONSTRAINT roles_pkey PRIMARY KEY (user_id, role_id),
  CONSTRAINT roles_role_id_fkey FOREIGN KEY (role_id)
      REFERENCES role_names (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE RESTRICT
);

Теперь в таблице role_names вы поместите все роли, которые хотите иметь. В таблице ролей вы можете назначать или удалять любое количество ролей для любого пользователя. Также вы можете выполнять поиск в таблицах ролей для конкретных пользователей или конкретных ролей - гораздо аккуратнее и быстрее, чем поиск по массивам, я думаю.

Не стесняйтесь добавлять ограничение FK и для поля user_id.

Да, вы можете использовать массив int для хранения списка ролей.

Вот связанный вопрос - Соединительные таблицы против массивов внешних ключей?

Другие вопросы по тегам