init
This commit is contained in:
61
README.md
61
README.md
@@ -1,2 +1,63 @@
|
||||
### Проектирование схемы БД
|
||||
|
||||
Поставленную задачу можно решить 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 категорий" />
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user