Files
db_design/README.md
Sayakhfarov_RH 03e7f46cdb init
2026-02-09 18:36:51 +03:00

64 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### Проектирование схемы БД
Поставленную задачу можно решить 3 основными подходами: Closure Table, Nested Sets, Adjacency List.
Я выбрал Closure Table (таблица замыканий), так как он обеспечивает простые и
быстрые запросы к поддеревьям категорий независимо от глубины вложенности.
В любом запросе к дереву я могу обойтись обычным JOIN по таблице связей
category_closure, без рекурсивных CTE и сложной логики в SQL. Это даёт
предсказуемую производительность на больших иерархиях и хорошо масштабируется
при росте количества уровней и категорий. Дополнительно, Closure Table
позволяет так же просто получать не только потомков, но и всех предков
узла (например, для хлебных крошек) через тот же механизм. Структура
данных при этом остаётся реляционной и хорошо индексируемой: по предку
`ancestor_id` и по потомку `descendant_id`. Операции изменения структуры
(добавление, перемещение, удаление узлов) сложнее, чем при простом `parent_id`,
но их можно инкапсулировать в функции/процедуры и вызывать как единый API.
В реальном каталоге товаров такие изменения происходят значительно реже, чем
чтение каталога и выборка товаров по разделам, поэтому увеличение стоимости
изменений логично обменять на ускорение чтения.
Таким образом, Closure Table лучше всего соответствует требованиям:
- произвольная глубина дерева,
- быстрый доступ к поддеревьям
- приемлемая стоимость редких операций изменения структуры категорий.
---
#### Диаграмма БД
<img src="https://storage.ooru.ru/web/db_design/schema.jpg" width="700" alt="Схема базы данных" />
---
### Примеры данных в таблицах
#### Покупатели
<img src="https://storage.ooru.ru/web/db_design/client.jpg" width="450" alt="Таблица покупателей" />
---
#### Заказы
<img src="https://storage.ooru.ru/web/db_design/customer_order.jpg" width="500" alt="Таблица заказов" />
---
#### Позиции заказа
<img src="https://storage.ooru.ru/web/db_design/customer_order_item.jpg" width="480" alt="Таблица позиций заказа" />
---
#### Номенклатура (товары)
<img src="https://storage.ooru.ru/web/db_design/product.jpg" width="500" alt="Таблица товаров" />
---
#### Категории
<img src="https://storage.ooru.ru/web/db_design/category.jpg" width="400" alt="Таблица категорий" />
---
#### Closure Table для категорий
<img src="https://storage.ooru.ru/web/db_design/category_closure.jpg" width="400" alt="Closure Table категорий" />
---