Пользователь и его машины: связь в базе данных

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.