Ни один подход не может решить все проблемы, с которыми вы можете иметь дело, выбор, который вы делаете, зависит от того, какой фактор для вас наиболее важен.
Большинство людей уклоняются от нескольких столов.Одна из причин в том, что вы не знаете, сколько таблиц вы можете получить в будущем.Другая причина состоит в том, что ваши запросы могут также раздуты, если вам нужно объединить несколько таблиц.И это может стать головной болью при обслуживании с несколькими запросами, которые обновляются каждый раз, когда вы добавляете таблицу.Наконец, добавление таблицы даже удаленно не так удобно, как добавление записи (вы действительно хотите, чтобы ваше приложение могло создавать таблицы?).
Один из вариантов - просто добавить все больше и больше полей в таблицу Product.Делая поля свойств равными NULL, разные продукты могут использовать разные поля.
Но ... Затем вам может понадобиться добавить логику, чтобы убедиться, что ProductX - всегда - имеет значение в FieldA, но что ProductY всегда имеетзначение в FieldB и т. д. И, возможно, некоторые метаданные о каждом типе продукта, чтобы ваше приложение знало, какие поля использовать для каких продуктов.Вам по-прежнему может потребоваться добавить новые поля, что, возможно, более аккуратно, чем добавление новых таблиц, но, тем не менее, вы, вероятно, не хотите, чтобы это делало Приложение.
Опция, которая полностью исключает использование DDL для добавления продукта, заключается в дальнейшей нормализации ваших данных и наличии свойств продукта в таблице Entity-Attribute-Value. изначально очень привлекателен для многих людей, поскольку он настолько универсален и гибок.
- Продукт (идентификатор, имя, другое глобальное свойство и т. Д.)
- Product_Properties (product_id, property_id, property_value)
Вероятно, у вас будут некоторые метаданные и дополнительная логика для обеспечения использования всех правильных свойств.Но теперь вы просто добавляете записи в общую структуру всякий раз, когда создаете новый продукт.
Но какого типа должно быть «значение свойства»?Возможно, потребуется хранить строки, даты, числа, что угодно.Вы можете сделать это строкой и использовать метаданные, чтобы знать, как ЗАКАЧИТЬ значение.У вас может быть несколько полей значений, по одному для каждого типа, и «field_type_id» или что-то, что указывает, из какого поля значения следует читать.
Это также менее удобно для определенных поисков.Если вы знаете product_id, найти свойства легко.Если вы хотите, чтобы все продукты с истекшим сроком годности были в прошлом, вы должны быть осторожны с тем, как вы структурируете данные и индексы, чтобы сделать запрос эффективным.Но если вы хотите (истекает <сегодня И стоимость> 50), тогда вы получите запрос, совершенно не похожий на тот, к которому вы привыкли - каждое значение находится в другом ROW, а не в другом ПОЛЕ.
Эффективность поиска действительно такованачинают уменьшаться по мере увеличения сложности запросов и соображений дизайна.
Какой путь вы выберете, зависит от функциональных требований приложения, архитектуры и дизайнерских решений, а также от полезного «вкуса».