Как НЕ спроектировать монстра вместо схемы БД

GuDron

dumpz.ws
Admin
Регистрация
28 Янв 2020
Сообщения
9,524
Реакции
1,550
Credits
33,479
Мини-гайд: как НЕ спроектировать монстра вместо схемы БД

Когда проект только начинается, есть соблазн «не заморачиваться» и сделать одну большую таблицу на всё.
Спойлер: потом будет больно.

Вот как этого избежать
1. Начинай с нормализации
– Смотри, какие поля повторяются.
– Разделяй по сущностям: клиент ≠ заказ ≠ товар.
– Нормальные формы — не академикам, а тебе на пользу.

2. Определи связи заранее
– Один ко многим? Многие ко многим?
– Используй FOREIGN KEY, чтобы база помогала тебе, а не мешала.

3. Не бойся JOIN-ов
– Да, их становится больше.
– Но это лучше, чем сотни NULL - ов и "status_1", "status_2" в одной колонке.

4. Планируй под рост
– Временные костыли становятся постоянными.
– Заложи масштабируемость: разнос сущностей, отдельные таблицы для логов, истории, связей.

5. Назначь ID-шки как бог велел
– PRIMARY KEY + автоинкремент или UUID.
– Не делай email или name ключом — это путь в баги.

Помни: хорошо спроектированная схема ускоряет разработку, а не тормозит её.
А переделывать схему сложнее, чем сделать нормально с самого начала.
 

S_Gur

Premium
Регистрация
26 Фев 2007
Сообщения
81
Реакции
17
Credits
1,504
Я несколько лет назад внедрил способ, который позволяет почти полностью избавить базу данных от Null-ов и Join-ов. Система простая:

1. При проектировании таблиц стараться все поля объявлять Not Null и задавать значения по умолчанию для каждого поля
2. При создании каждой таблицы в нее прописывается одна запись с идентификатором 0 (если первичные ключи Integer) и значениями полей по умолчанию. Я для себя называю их нулевыми записями
3. Все Foreign Key-поля в таблицах объявляются как Not Null Default 0
4. Ну и - само собой - все Foreign Key-поля индексируются

В результате 99% запросов у меня работают по связке Primary Key - Foreign Key, а в строковых полях, взятых из нулевых записей, которые нужно показать в наборах данных, при желании можно прописать какое-то внятное значение (например, "не установлено"). Я обычно - если нет специальных потребностей - использую просто многоточие - "..."

Естественно, бывают ситуации, когда надо использовать и Null, и Join, но их обычно - во всяком случае, в моих проектах, ничтожно мало