SQL

Postgresql Как правильно наладить связь между таблицами в базк данныъ?

Postgresql Как правильно наладить связь между таблицами в базк данныъ?
Например, есть две таблицы:
1) children
child_id child_name
1 Вася
2 Петя
3 Гоша
4 Даня

2) drawings(рисунки, которые они рисовали вместе по чутьчуть)
drawing_id sketch_name(дети, которые делали набросок рисунка карандашом) color_name(дети, которые раскрашивли рисунок этот)
1 1,2 2,4,3
2 3,4,1 1,2,3

Понятно, что связь многие ко многим делается через 3-ю таблицу drawings_children
но тут ведь какая-то путница совсем получается!
АА
Ак Ак
41
Делаем таблицу связи drawings_children с 4 полями:
 child_id   INTEGER -- ключ ребёнка
drawing_id INTEGER -- ключ рисунка
is_sketch BOOLEAN -- TRUE, если ребёнок участвовал в создании эскиза
is_color BOOLEAN -- TRUE, если ребёнок участвовал в раскраске
И заполняем её для каждой существующей пары ребёнок-рисунок.

И, разумеется, никаких sketch_name и color_name в таблице drawings быть не должно.

Два отдельных поля потому, что ребёнок может участвовать и в эскизе, и в раскраске.

Но можно сделать финт ушами и хранить набор флагов в одном поле. В PostgreSQL для этого есть тип BIT: B'01' - эскиз, B'10' - раскраска, B'11' - обе стадии.
Андрей Григорьев
Андрей Григорьев
88 487
Лучший ответ
Ак Ак СПАСИБО))))))))))))))))))))))))))))))))))))))))))
Чтобы наладить связь между таблицами в PostgreSQL, можно использовать внешние ключи (foreign key), которые обеспечивают связь между столбцами двух таблиц. В вашем случае, чтобы связать таблицы "children" и "drawings", можно создать таблицу "drawings_children", которая будет содержать внешние ключи на столбцы "child_id" и "drawing_id". Например:

CREATE TABLE drawings_children (
child_id INTEGER REFERENCES children(child_id),
drawing_id INTEGER REFERENCES drawings(drawing_id)
);

При этом таблица "drawings" должна содержать первичный ключ (primary key) на столбце "drawing_id", а таблица "children" - на столбце "child_id". То есть, в таблице "drawings":

CREATE TABLE drawings (
drawing_id SERIAL PRIMARY KEY,
sketch_name TEXT,
color_name TEXT
);

А в таблице "children":

CREATE TABLE children (
child_id SERIAL PRIMARY KEY,
child_name TEXT
);

Теперь, чтобы связать рисунок из таблицы "drawings" с детьми из таблицы "children", нужно добавить записи в таблицу "drawings_children", указывая идентификаторы детей и рисунков. Например:

INSERT INTO drawings_children (child_id, drawing_id) VALUES
(1, 1),
(2, 1),
(4, 1),
(3, 2),
(4, 2),
(1, 2),
(2, 2);

Таким образом, теперь можно использовать запросы, которые ссылаются на несколько таблиц. Например, чтобы получить список детей, которые рисовали какой-то конкретный рисунок (например, с идентификатором 1), можно использовать следующий запрос:

SELECT c.child_name
FROM children c
JOIN drawings_children dc ON c.child_id = dc.child_id
WHERE dc.drawing_id = 1;

Этот запрос вернет список имен детей, которые рисовали рисунок с идентификатором 1.
Ак Ак Это не совсем то? В этом случае не получится составить запрос на получение списка детей, которые , например, только раскрашивали первый рисунок или которые только делали набросок для первого рисунка
Ак Ак СПАСИБО ГРОМАДНОЕ!!!!!!!!!!!!!!!!!!!!!!!)))))))))))))))))))))))))))))))))))