#sql #postgresql #database-design #foreign-keys #create-table
#sql #postgresql #база данных-дизайн #внешние ключи #создать таблицу
Вопрос:
Я работаю над созданием базы данных PostgreSQL.
У меня есть 2 таблицы — пользователи и проекты
-
таблица
Users
состоит из: Id, имени пользователя, пароля и Project_ID (не уверен, нужно ли это)- Первичный ключ — идентификатор
- Внешний ключ — Project_id как идентификатор в таблице проектов
-
таблица
Project
: идентификатор, имя, статус, крайний срок
Как я могу (если могу) реализовать отношение один ко многим в этом случае?
Итак, если я сделаю запрос объединения, чтобы показать мне пользователя с определенным идентификатором и все его связанные проекты?
Или было бы проще создать внешний ключ User_ID в таблице проекта, относящийся к идентификатору таблицы пользователей?
Ответ №1:
Если ваши пользователи являются только участниками проекта, один проект может состоять из нескольких пользователей, и пользователь может быть участником в нескольких проектах. В этом случае @GMB предоставил правильный ответ.
Но правильный ответ зависит также от вашего бизнеса: если у каждого проекта есть только один менеджер, вы можете определить manager_id в project, и таким образом каждый проект связан с 1 менеджером, а менеджер (= пользователь) может быть менеджером нескольких проектов.
В user_project
вы также можете указать роль пользователя в проекте (при условии, что пользователь имеет только одну роль в проекте).
Комментарии:
1. Спасибо, я действительно понял, что конкретно не указывал, что я хочу иметь. Я хочу, чтобы у пользователя были все его проекты, сначала я должен был спросить себя, чего я хочу = D
Ответ №2:
Действительно похоже, что у вас отношения «многие ко многим», где каждый пользователь может участвовать в нескольких проектах, и в каждом проекте может участвовать несколько пользователей. Если это так, то вам нужна третья таблица в вашем проекте для представления этой взаимосвязи — это называется таблицей мостов или таблицей соединений.
Пример DDL:
create table users (
id int primary key,
username text
);
create table projects (
id int primary key,
name text,
status text,
deadline date
);
create table user_projects (
id int primary key,
user_id int references users(id),
project_id int references projects(id),
unique (user_id, project_id)
);
Теперь предположим, что вы хотите перечислить всех пользователей пользователей и все проекты, в которых они участвуют:
select u.*, p.*
from users u
inner join user_projects up on up.user_id = u.id
inner join projects p on p.id = up.project_id
order by u.id, p.id
Комментарии:
1. Спасибо за ответ. Я, вероятно, неправильно выразился, что хочу только показать пользователю все его проекты, но не наоборот. В любом случае, у меня появилась идея 🙂