gephaest
@gephaest
PHP, Yii2, Laravel

Лучший способ хранения данных при переменном большом количестве атрибутов?

Начинаю пилить свой проект, пока на стадии обдумывания концепции и тех.деталей.
Вот сейчас застрял на том, что не знаю, как лучше хранить данные приложения.
Предполагается, что будут несколько видов сущностей, у которой может быть переменное количество заданных атрибутов . Можно заполнить 10 штук, а можно 70, но у каждого вида сущностей заранее известен набор атрибутов. Причем будет несколько видов этих сущностей- некоторые атрибуты будут пересекаться, но большая часть- отличаться. После технической реализации атрибуты могут меняться, но это скорее в порядке исключения. Предполагаемое число записей- 100-300k строк. Загвоздка в том, что хотелось бы реализовать ревизии материалов, так что количество строк будет постоянно расти. Чтение будет преобладать над (пере)записью. Количество запросов прогнозировать сложно, тем более еще не задумывался над кешированием.
Самое простое решение- сделать несколько таблиц в MySQL- в одной общие атрибуты и на каждый вид сущность по уникальной таблице с уникальными атрибутами. Минус этого подхода- таблица с 50 столбцами не выглядит хорошей идеей :)
Второе, что пришло мне в голову- MongoDB, но с ним опыта нету, да и после прочтения некоторых материалов я засомневался в целесообразности выбора.
Ну и третий вариант- использовать PostgreSQL с его типом данных JSON.
  • Вопрос задан
  • 3258 просмотров
Решения вопроса 1
В MySQL можно сделать так: в одной таблице хранить сущности (ID сущности, название, ...), в другой таблице все атрибуты (ID, название), в третьей значения атрибутов (ID сущности, ID атрибута, значение). Если нужно, то добавить еще две таблицы: виды сущностей (ID вида, название, ...) и связи видов сущностей с атрибутами (ID вида, ID атрибута). Такая схема позволяет менять кол-во атрибутов без переделки структуры таблиц и нет таблиц с 50 столбцами).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
smagen
@smagen
Руководитель разработки Postgres Professional
В PostgreSQL можно использовать расширение hstore или, начиная с 9.4, тип jsonb (json с эффективным бинарным хранением).
Ответ написан
Комментировать
@Coffin
Можно типа такого.
Product - Продукты
Product_features - Свойства продукта
Features - Свойства (тут можно дополнительно описать, какое значение у свойства, например "строка", "диапазон", "число" и т.д)
Feature_values - Значения свойств (тут можно объеденить с таблицей Product_features)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы