RayMefise
@RayMefise
Java, PHP, C, C++, C#, .NET, QT

Имеет ли смысл разбивать значения свойств товаров по разным таблицам?

Проектирую базу данных под интернет магазин с большим количеством товаров и свойств.
В большинстве проектов значения свойств товаров хранятся все в одной таблице, не зависимо от типа свойства.
Но есть вариант когда значения свойств товара разбиваются на разные таблицы по типам значений: строки в одной таблице, числа в другой, элементы списка в третей.
У обоих подходов есть свои плюсы и минусы, но меня больше интересует быстродействие, в каком случае запросы будут выполняться быстрее (например при поиске товара по значению свойств) и в каком случае будет меньше проблем с возможным мусором в базе (по сути оба метода используют не нормализованную базу)
  • Вопрос задан
  • 184 просмотра
Пригласить эксперта
Ответы на вопрос 2
unfilled
@unfilled
EAV (entity-attribute-value) и быстродействие - это, в общем случае, понятия прямо противоположные. Например, вы захотите сделать выбор всех товаров со свойством "Вес" и значением свойства 500 грамм - никакие индексы вам не помогут (точнее мало помогут), при достаточно большом количестве товаров и свойств.
В обоих случаях (всё в одной EAV-таблице, всё в EAV-таблицах по типам данных) у вас возможен мусор в базе, т.к. не будут работать никакие ограничения целостности (FK, CHECK, DEFAULT).
Если вы всё-таки хотите работать с EAV, можно сделать таблицу Entity|Attribute|Value_str|Value_int|Value_boolean. Какой, кхм, сорт выбирать - имхо, разницы нет.
Ответ написан
Все очень опционально.
Если у вы данные в приложение передаете в json, то и храните в json(например, в постгресе хорошая поддержка таких типов полей)
, ключи, как первичные, так и внешние, вынесите в атрибуты таблицы. Этот подход даст большую гибкость в изменении свойств товаров. Я бы начал с него.
Упомянутый unfilled EAV, например, также даст вам возможность гибко менять/добавлять и удалять свойства товаров на странце. Но для получения результирующего набора данных нужно делать много соединений таблиц. А стоимость запроса зависит от многих факторов(наличие\отсутсвии индекса, объем выбираемых данных, соотношение объема к общему объему таблицы, ...) и от вашего скила.
Не бывает хороших или плохих структур\архитектур,а есть только структуры\архитектуры, которые отвечают или не отвечают текущим требованиям. Все очень сильно зависят от реализации и требований. Тут главное не попасть в "ошибку преждевременной оптимизации".
Любой из подходов чреват гемороями и деградации производительности. Тем более приложение будет меняться со временем.
Любая структура БД покажет себя только в реальных условия и на реальных данных и в нагрузке.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы