Архитектура БД и сортировка?

Доброй ночи! Хотелось бы услышать советов и критики моей архитектуры БД, относительно нескольких сущностей, а так же помощи и советов в сортировке этих вещей.

Есть сервис, в котором храняться шаблоны товаров, они добавляються администратором. Потом, поставщики могут выбрать из списка товар и задать цену и кол-во. После чего оно продается. Так же есть такие вещи как характеристики, группы характеристик, по которым мы собираем N характеристик и привязываем к товару. Например, группа характеристик - телефон, будет иметь в себе, скажем, экран, память, хранилище.

У каждой характеристики есть свои значения, например экран: ips, oled, amoled, etc...

Следовательно у меня есть таблица для хранения, названия характеристики
specifications:
id,
title,
position


Значения характеристик я храню в таблице
specifications_values:
id,
specification_id
value,
position


Для группы характеристик 2 таблицы, одна хранит название группы, другая связь между группой и характеристикой.
specifications_groups:
id,
title

specifications_groups_relation:
id,
specification_group_id,
specification_id


Так же, мне нужно хранить связь, между товаром, характеристикой, которая к нему привязана и значением этой характеристики. Для этого, есть таблица
products_specifications:
id,
p_id - идентификатор продукта,
v_id - идентификатор значения характеристики,
s_id - идентификатор характеристики

Когда поставщик создает товар - он выбирает группу характеристик и у него появляются N тегов select, количество которых равно количеству характеристик в группе.

Дальше, когда идет запрос к серверу, я создаю товар, беру его идентификатор, беру значения для полей v_id, s_id, и сохраняю их.

Штука в чем - насколько неправильно и награможденно выглядит база для решения моей задачи? Что убрать, а что добавить? Может есть замечания и советы, буду предельно благодарен за любую, конструктивную критику и советы.

Дальше мне нужно выводить товары, отсортировав их по определенным правилам. Например товары из категории Iphone 6 будут иметь группу характеристик "Телефон", хотя, конечно, пользователь может выбрать и любую другую.

Так вот, мне необходимо взять все товары из этой категории, взять характеристики из группы характеристик привязанных к товару и отсортировать их. Для этого у таблиц specifications_values и specifications есть поля position.
Суть в чем - я сортирую характеристики по position, беру первую характеристику, захожу в нее, сортирую товары по значениям этой характеристики, опираясь на поле position. Получив результат, мне необходимо взять следующую характеристику, перейти к ее значениям и снова отсортировать товары, которые были отсортированы по предыдущей характеристике и так до тех пор, пока не пройдусь по всем привязанным характеристикам. Потом, вывожу.

В конечном итоге я должен получить, что-то такое
Phone X 16GB(position:1) EU(position:1)
Phone X 16GB(position:1) CHINA(position:2)
Phone X 32GB(position:2) EU(position:1)
Phone X 32GB(position:2) CHINA(position:2)


Какой максимально правильный способ я должен использовать. Разбивать ли сортировку на части или это все можно без большой крови сделать используя eloquent orm?

Проект на laravel. Большое спасибо за любую помощь!
  • Вопрос задан
  • 77 просмотров
Решения вопроса 1
@EvgeniiR
https://github.com/EvgeniiR
Костыли типа EAV часто можно красивее разрулить используя jsonb.

без большой крови сделать используя eloquent orm?
Проект на laravel.

Выбирая задачу под инструменты, а не инструменты под задачу, так и придется гвозди микроскопом забивать.

Upd: Вот вам пример как сделать быстро удобно и красиво - https://coussej.github.io/2016/01/14/Replacing-EAV...

Upd2: best practices обычно все же начинать с модели поведения а не модели данных, проблем с нагрузками у вас явно нет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
orlov0562
@orlov0562
I'm cool!
Штука в чем - насколько неправильно и награможденно выглядит база для решения моей задачи? Что убрать, а что добавить?

Выглядит все нормально. Особенно если это все работает. Т.к. сделать структуру в бд это пол проблемы, нужно её еще наполнять и делать по ней выборки.

Может есть замечания и советы, буду предельно благодарен за любую, конструктивную критику и советы.


1) Похоже, что ты изобретаешь паттерн EAV. Советую погуглить как его используют в связке с БД.

2) Я не уверен, но могу предположить, что у тебя могут возникнуть проблемы на большом кол-ве товаров и составных фильтрах. Поэтому советую подумать какой реальный объем записей у тебя будет +/-. И сгенерировать это кол-во данных в базе. И тестить твое решение на нем.
Ответ написан
Ваш ответ на вопрос

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

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