╔══════════════════════════════════════════════════════════════════════════════╗
║                        ШПАРГАЛКА: 3НФ и структура CSV                      ║
╚══════════════════════════════════════════════════════════════════════════════╝

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ПРАВИЛА НОРМАЛИЗАЦИИ (кратко)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1НФ — нет повторяющихся групп, каждая ячейка хранит одно значение.
      Пример нарушения: столбец "телефоны" = "89001, 89002"

2НФ — нет частичных зависимостей (каждый неключевой столбец зависит от ВСЕГО
      первичного ключа, а не от его части).
      Актуально только если ключ составной.
      Пример нарушения: таблица (заказ_id, товар_id, название_товара)
      → название_товара зависит только от товар_id, а не от пары.
      Решение: вынести название_товара в отдельную таблицу товаров.

3НФ — нет транзитивных зависимостей (неключевой столбец не зависит от другого
      неключевого столбца).
      Пример нарушения: таблица (товар_id, категория_id, название_категории)
      → название_категории зависит от категория_id, а не от товар_id.
      Решение: вынести категории в отдельную таблицу.

КАК ПРИВОДИТЬ К 3НФ (алгоритм):
  1. Найди столбцы, которые повторяются в строках (имя категории, имя
     поставщика и т.д.) — это кандидаты на вынос.
  2. Создай для них отдельную таблицу с суррогатным ключом (id).
  3. В исходной таблице замени текстовые столбцы на внешний ключ (_id).
  4. Проверь: каждый неключевой столбец должен зависеть ТОЛЬКО от
     первичного ключа своей таблицы.


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 СТРУКТУРА ТАБЛИЦ НАШЕГО ПРОЕКТА (CSV-заголовки + пример данных)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

── roles.csv ──────────────────────────────────────────────────────────────────
role_id,role
1,Администратор
2,Менеджер
3,Гость

── users.csv ──────────────────────────────────────────────────────────────────
user,email,password,role_id
Иван Иванов,ivan@mail.ru,qwerty123,1
Мария Петрова,maria@mail.ru,pass456,2
  FK: role_id → roles.role_id

── categories.csv ─────────────────────────────────────────────────────────────
category_id,category
1,Мебель
2,Электроника
3,Канцелярия

── manufactures.csv ───────────────────────────────────────────────────────────
manufacture_id,manufacture
1,IKEA
2,Samsung
3,Pilot

── suppllers.csv ──────────────────────────────────────────────────────────────
suppllers_id,suppllers
1,ООО Поставка
2,ИП Смирнов

── products.csv ───────────────────────────────────────────────────────────────
article,product_name,unit,price,stock,sale,description,photo,category_id,manufacture_id,suppllers_id
ART001,Стул офисный,шт,3500.00,10,5,Удобный стул,,1,1,1
ART002,Ноутбук,шт,75000.00,5,10,Мощный ноутбук,,2,2,2
  FK: category_id  → categories.category_id
  FK: manufacture_id → manufactures.manufacture_id
  FK: suppllers_id  → suppllers.suppllers_id

  Из какой "большой" таблицы вышли поля:
  article, product_name, unit, price, stock, sale, description, photo — своё
  category_id  ← вынесена категория (было поле "категория" текстом)
  manufacture_id ← вынесен производитель
  suppllers_id   ← вынесен поставщик

── status.csv ─────────────────────────────────────────────────────────────────
status_id,status
1,Новый
2,В обработке
3,Доставляется
4,Выполнен
5,Отменён

── adresses.csv ───────────────────────────────────────────────────────────────
adress_id,adress
1,г. Москва, ул. Ленина 1
2,г. Санкт-Петербург, пр. Невский 10

── orders.csv ─────────────────────────────────────────────────────────────────
order_id,status_id,adress_id,order_date,delivery_date,article
1,1,1,2024-01-15,2024-01-20,ART001
2,2,2,2024-01-16,2024-01-22,ART002
  FK: status_id  → status.status_id
  FK: adress_id  → adresses.adress_id
  FK: article    → products.article

── orderproducts.csv ──────────────────────────────────────────────────────────
order_id,article,count
1,ART001,2
1,ART002,1
2,ART002,3
  Связующая таблица (многие-ко-многим: заказ ↔ товар)
  FK: order_id → orders.order_id
  FK: article  → products.article


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ПРИМЕР: КАК РАЗБИТЬ ОДНУ БОЛЬШУЮ ТАБЛИЦУ ДО 3НФ
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

ИСХОДНАЯ (плохая) таблица:
┌──────────┬──────────────┬───────────┬──────────────────┬───────────┬──────────────┐
│ article  │ product_name │ price     │ category         │ supplier  │ supplier_inn │
├──────────┼──────────────┼───────────┼──────────────────┼───────────┼──────────────┤
│ ART001   │ Стул         │ 3500      │ Мебель           │ ООО Снаб  │ 7700123456   │
│ ART002   │ Стол         │ 7000      │ Мебель           │ ООО Снаб  │ 7700123456   │
│ ART003   │ Ноутбук      │ 75000     │ Электроника      │ ИП Иванов │ 5001987654   │
└──────────┴──────────────┴───────────┴──────────────────┴───────────┴──────────────┘

Нарушения 3НФ:
  - category повторяется → вынести в таблицу categories
  - supplier и supplier_inn зависят друг от друга, а не от article → вынести

ПОСЛЕ НОРМАЛИЗАЦИИ:
  categories:  category_id, category
  suppliers:   supplier_id, supplier, supplier_inn
  products:    article, product_name, price, category_id, supplier_id


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ПОРЯДОК ИМПОРТА CSV (важно из-за внешних ключей!)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1. roles
2. users          (нужен roles)
3. categories
4. manufactures
5. suppllers
6. products       (нужны categories, manufactures, suppllers)
7. status
8. adresses
9. orders         (нужны status, adresses, products)
10. orderproducts (нужны orders, products)

Правило: сначала всегда импортируй справочники (без FK),
         потом таблицы, которые на них ссылаются.
