PostgreSQL создает внешний ключ для всех строк другой таблицы

#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. Спасибо за ответ. Я, вероятно, неправильно выразился, что хочу только показать пользователю все его проекты, но не наоборот. В любом случае, у меня появилась идея 🙂