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
но тут ведь какая-то путница совсем получается!
SQL
Postgresql Как правильно наладить связь между таблицами в базк данныъ?
Делаем таблицу связи drawings_children с 4 полями:
И, разумеется, никаких sketch_name и color_name в таблице drawings быть не должно.
Два отдельных поля потому, что ребёнок может участвовать и в эскизе, и в раскраске.
Но можно сделать финт ушами и хранить набор флагов в одном поле. В PostgreSQL для этого есть тип BIT: B'01' - эскиз, B'10' - раскраска, B'11' - обе стадии.
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' - обе стадии.
Ак Ак
СПАСИБО))))))))))))))))))))))))))))))))))))))))))
Чтобы наладить связь между таблицами в 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.
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.
Похожие вопросы
- PostgreSQL Extensions. С помощью модуля tablefunc получите из таблицы projects базы HR
- как в PostgreSQL(!) сделать группировку по одному полю но вывести в результат остальные поля из таблицы
- Зачем нужны схемы (public) в postgresql?
- Postgresql ввод данных пользователем
- SQL. Есть таблица а и b как мне поставить ограничение на поле таблицы b, на основании поля таблицы a? пример в описании
- Можно ли связать одно поле таблицы с несколькими полями другой таблицы?
- PostgreSQL - концепция хранения данных
- Вопрос по SQL - уникальное поле ID для трёх таблиц (нельзя вставить значения в одну, если оно есть в другой таблице).
- Как в одной записи таблицы хранить несколько полей одного типа (не фиксированное число)?
- Блин что то не могу найти способ произвести эффективную выборку данных из таблицы БД?