Найти в Дзене
LITVINOV-UPGRADE-LINUX

[Конспект] Разбор задачи про связь многие-ко-многим в БД

Конспект по подкасту, ссылка на видео дана в конце статьи Есть интернет магазин, в котором пользователи могут заказывать различные товары. Опишите, как организовать хранение данных в базе данных для учета пользователей, товаров и заказов. Удобство в draw.io, есть первичный ключ, можно задать вторичные ключи. Сразу 3 поля (можно уточнить поля у интервьюера, но придумать поля приветствуется) Название таблиц желательно на английском (но можно и на русском назвать сущности) Главное чтобы базы назывались в одинаковом количестве **обычно в единственном** (или заказы тогда товары, или заказ тогда товар) вписывам id если логическая схема (достаточно id) если физическая модель то прописать - тип UUID - UNIQUE - уникальное - NOT NULL - обязательное Заполняем поля Дополнительные атрибуте, если физическая модель - телефон - UNIQUE (уникальный) название (спросить должен ли быть уникальным?) цена в копейках - Integer у товара может быт много изображений - массив ссылок это не хорошо можно сделать до
Оглавление

Конспект по подкасту, ссылка на видео дана в конце статьи

Подборка задач

Задача 1.

Есть интернет магазин, в котором пользователи могут заказывать различные товары. Опишите, как организовать хранение данных в базе данных для учета пользователей, товаров и заказов.

-2

справа Entity Relation для создания таблиц. (использовать List не надо, они для списков)

-3

Удобство в draw.io, есть первичный ключ, можно задать вторичные ключи.

-4

Сразу 3 поля (можно уточнить поля у интервьюера, но придумать поля приветствуется)

-5

Название таблиц желательно на английском (но можно и на русском назвать сущности)

-6

Главное чтобы базы назывались в одинаковом количестве **обычно в единственном** (или заказы тогда товары, или заказ тогда товар)

-7

вписывам id

-8

если логическая схема (достаточно id)

если физическая модель

то прописать

- тип UUID

- UNIQUE - уникальное

- NOT NULL - обязательное

-9

Заполняем поля

-10

Дополнительные атрибуте, если физическая модель

- телефон - UNIQUE (уникальный)

-11

Товар

название (спросить должен ли быть уникальным?)

цена в копейках - Integer

-12

у товара может быт много изображений - массив ссылок это не хорошо

можно сделать дополнительную таблицу

-13

Заказ

Пользователь USER_ID

и есть FK и задается связь (Стрелочки нет просто линия) -- далее проставив 1 или * продумаем какая это связь

Поля:

- Дата

- Адрес доставки (копировать из настроек пользователя)

-14

По хорошему нужно структурировать адрес

где все прописано

и ссылаемся стрелочкой

-- Называется: Структурированный адрес.

-15

И есть связь товары в заказе

!!!Ошибка!!! получается в 1 заказе только 1 пользователь.

-16

Но у одного пользователя может быть много заказов

ставим звездочку

-17

далее выбираем большую кратность

1 пользователь - много заказов

- зеленым цветом выбираются кратности

-18

Многие

- внешний ключ там где многие

где 1 там первичный ключ

-19

Пропишем заказ

соберем из листов пример

id - номер - пользователь_id - Дата и время (timestamp)

-20

Пользователь

-21

Ссылка на конкретный пользователь

1 - пользователь 2 заказа

1 пользователь 1 заказ

-22

Важно:

В модели таблицы не прописываем демо значения

-23

Товар

можно добавить столбец со ссылкой с троеточием

-24

Заполняем таблицу

-- цены в копейках

-25

Почему связь сразу

Пользователь - Заказ (она ставиться сразу она не проблематичная)

а вот заказ - товар

(может быть несколько товаров в 1 заказе, и несколько заказов с одним товаром)

-26

Важно: многие ко многим быть не должно

их надо развязать

-- И вводим промежуточную таблицу

Почему вводим?

при добавлении в заказ 2-х товаров - 777 и 779

-- 2 строчки со всеми полями дата пользователь ... начинает дублироваться

---- Это проблема и если поменять имя пользователя, номер то нужно обновить 3!!! записи вместо 1 !!!

(Это нарушает требование нормальных форм)

-27

Поэтому такую колонку убираем и отслеживаем чтобы такого небыло

-28

Внешняя таблица

- как назвать (Заказ_Тавар)

- не нужен первичный ключ PK - (нужен если будут доп поля )

-29

Многие в промежуточной таблице

1 - по краям

на товар мы ссылаемся на конкретный товар

-30

Таблица (Заказ-Товар)

и в одной таблице соответствие Заказа_ID и Товар_ID

и если есть дата и время оплаты,

-- Если данные в таблице заказ обновилось время

-- ТО не надо обновлять 50 строк -> достаточно в заказе обновить время

-31

В итоге

-32

Подвох про интернет магазин

количество товаров в таблице Заказ-Товар

-33
-34

Историчность

- могут в разные данные меняться цены

ТО добавляем поле статус в Заказ

И Цена в Заказ_Товар

КОГДА статус обновился - цена зафиксировалась (оплата прошла)

(Очень полезна когда цена рядом с заказом )

Тоже можно делать с названием, и оставлять возможность замены при прохождении статуса - Оплата

-35
-36

Ссылки

Связь "многие-ко-многим" в БД: разбор задачи с собеседования на системного аналитика