13. Спроектировать связь пользователя и автомобилей
Условие задачи:
Необходимо спроектировать структуру базы данных, в которой:
один пользователь может владеть несколькими автомобилями;
каждый автомобиль принадлежит только одному пользователю.
Нужно определить связь между таблицами пользователей и автомобилей.
Спойлеры к решению
Подсказки
💡 Такая связь называется
💡 Внешний ключ должен находиться на стороне «многие», то есть в таблице автомобилей.
💡 Поле
💡 Чтобы получить пользователей вместе с автомобилями, можно использовать
One-to-Many.💡 Внешний ключ должен находиться на стороне «многие», то есть в таблице автомобилей.
💡 Поле
user_id в таблице автомобилей должно ссылаться на users.id.💡 Чтобы получить пользователей вместе с автомобилями, можно использовать
JOIN.Решение
Таблица пользователей:
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
Таблица автомобилей:
CREATE TABLE cars (
id INT PRIMARY KEY,
model VARCHAR(50) NOT NULL,
user_id INT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id)
);
Связь выглядит так:
users cars
id <------------- user_id
1 N
Один пользователь может иметь несколько записей в cars, но каждая машина содержит только один user_id.
Пример данных:
INSERT INTO users (id, name) VALUES
(1, 'Ivan'),
(2, 'Oleg');
INSERT INTO cars (id, model, user_id) VALUES
(4422, 'Opel 1', 1),
(4523, 'BMW 5', 1),
(4612, 'VW', 2);
Получить пользователей вместе с их автомобилями:
SELECT
u.id AS user_id,
u.name AS user_name,
c.id AS car_id,
c.model AS car_model
FROM users u
LEFT JOIN cars c
ON c.user_id = u.id
ORDER BY u.id;
LEFT JOIN позволяет вывести в том числе пользователей, у которых пока нет автомобилей.
Таким образом, связь One-to-Many реализуется внешним ключом cars.user_id, который ссылается на users.id.