Jaywalking (Нарушение разметки / Списки через запятую)
- Суть: Хранение нескольких значений в одном поле через разделитель (например,
1,5,19).
- Проблема: Невозможно эффективно индексировать, сложно искать и обеспечивать целостность данных.
- Как правильно: Создать отдельную (зависимую) таблицу для хранения этих значений и связать её с основной через отношение "один-ко-многим" (таблица пересечений / Junction Table).
Naive Trees (Наивные деревья)
- Суть: Использование списка смежности (хранение
parent_id в каждой строке) для работы с древовидными структурами.
- Проблема: Сложность и рекурсивность запросов для получения полного поддерева.
- Как правильно: Использовать альтернативные методы, например, Closure Table (таблица замыканий) или Nested Sets (вложенные множества), которые позволяют получать целые поддеревья одним запросом без рекурсии.
Keyless Entry (Отсутствие ключей)
- Суть: Создание таблиц без первичного ключа (Primary Key).
- Проблема: Появление дубликатов строк, невозможность надежно идентифицировать запись.
- Как правильно: Всегда определять Primary Key для каждой таблицы.
See No Evil (Не вижу зла)
- Суть: Отказ от использования внешних ключей (Foreign Keys) и ограничений целостности на уровне БД.
- Проблема: Потеря связи между таблицами, появление «сиротских» записей.
- Как правильно: Декларировать внешние ключи в схеме базы данных, чтобы СУБД гарантировала ссылочную целостность.
Metadata Tribbles (Трибблы метаданных / EAV)
- Суть: Использование паттерна Entity-Attribute-Value (три колонки: сущность, атрибут, значение) для хранения разнородных данных.
- Проблема: Сложные запросы, потеря типов данных, невозможность использовать ограничения SQL.
- Как правильно: Использовать классическое моделирование (Class Table Inheritance) — создавать отдельные таблицы для подтипов сущностей или специфические колонки для атрибутов.
Polymorphic Associations (Полиморфные ассоциации)
- Суть: Создание колонки
commentable_id и commentable_type, чтобы ссылаться на разные таблицы.
- Проблема: Невозможно объявить настоящий внешний ключ, сложность JOIN'ов.
- Как правильно: Создавать отдельные таблицы связей для каждого типа целевой сущности (обратные связи) или использовать общую родительскую таблицу (Supertype/Subtype).
Multicolumn Attributes (Многоколоночные атрибуты)
- Суть: Создание нескольких колонок для одного атрибута (например,
phone1, phone2, phone3).
- Проблема: Сложность поиска, пустые значения (NULLs), фиксированный лимит количества.
- Как правильно: Выносить атрибут в дочернюю таблицу (One-to-Many), где каждой строке соответствует одно значение.