Как хранить характеристики товаров в БД и делать поиск по ним?

Есть много поставщиков, их товары надо хранить в БД. Сложность в том, что у товаров много разных характеристик и упорядочить их не получается. На данный момент под них заведено 1 свойство, в котором храниться как есть и поиск делается через LIKE.

Скажите, как в теории можно хранить такие характеристики что бы можно было быстро делать по ним поиск? на данный момент LIKE не справляется. При 6 млн товаров задача подсчитать кол-во товаров по заданной характеристики достигается от несколько сек до десятков секунд.
  • Вопрос задан
  • 196 просмотров
Решения вопроса 2
@bacon
Варианты: денормализация, вынос поиска в отдельный софт, elasticsearch, sphinx или подобный.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@dimoff66
Кратко о себе: Я есть
Характеристики относятся к товарам? То есть у одного товара только один набор характеристик или один товар может приходить и продаваться с разными наборами характеристик, например кроссовки адидас, цвет: Белый, размер: 37 и кроссовки адидас, цвет: Синий, размер: 39. Если второй, более сложный случай, то делаем следующие таблицы

1) Таблица Properties (id, name, valueType) - здесь просто храним список возможных свойств
2) Таблица PropertyValues (id, propertyId, value) - здесь храним возможные варианты значений для свойств, у которых не простой тип, то есть не строка, не число, не булево, не дата
3) CharacteristicsSet (id, productId, name) - здесь будет храниться набор свойств для конкретной позиции товара на складе, name будет составляться автоматически как строка из свойств и их значений, указанных для позиции товара
4) CharacteristicsValues (chartacteristicSetId, propertyId, valueType, value) - здесь будут храниться значения свойств для конкретной характеристики.

Например нам пришли партии кроссовок со свойствами цвет: белый, размер: 37й и цвет: синий, размер: 39й. (например 100 и 50 штук соответственно)

Тогда наши таблицы будут выглядеть следующим образом:

Properties:
id: 1, property: 'Цвет', valueType: 'set'
id: 2, property: 'Размер', valueType: 'number'

PropertyValues:
id: 1, propertyId: 1, value: 'Белый'
id: 2, propertyId: 1, value: 'Красный'
id: 3, propertyId: 1, value: 'Синий'

CharacteristicsSet:
id: 1, productId: 777, name: 'Цвет: белый, размер: 37'
id: 2, productId: 777, name: 'Цвет: синий, размер: 39'

CharacteristicsValues
chartacteristicSetId: 1, propertyId: 1, valueType: set, value: 1(ссылка на белый цвет)
chartacteristicSetId: 1, propertyId: 2, valueType: number, value: 37
chartacteristicSetId: 2, propertyId: 1, valueType: set, value: 2(ссылка на синий цвет)
chartacteristicSetId: 2, propertyId: 2, valueType: number, value: 39

Ну и в таблице склада можно будет хранить записи в виде:
productId: 777, characteristicsSetId: 1, quantity: 100
productId: 777, characteristicsSetId: 2, quantity: 50

Если же различный набор свойств для одного товара нам не нужен, то все то же самое, но обходимся без таблицы CharacteristicsSet: а в CharacteristicsValues ссылаемся на сам товар. Соответственно весь поиск будет проходить по одной таблице CharacteristicsValues с индексированными полями. Например чтобы найти любые товары с цветом Белый, мы делаем поиск

select * from CharacteristicsValues where propertyId = 1 and value = 1


ну и с соответствующим соединениям по таблицам характеристик и(или) товаров
Ответ написан
Ваш ответ на вопрос

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

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