У меня есть существующая база данных MSSQL для решения для электронной торговли. Существует множество групп атрибутов продукта и множество атрибутов. Клиенту требуется фильтрующее решение, и я чувствую, что текущая реализация не очень эффективна, поэтому я хотел обратиться к сообществу администраторов баз данных, чтобы изложить некоторые предложения о том, как лучше всего совершенствовать.Эффективность SQL - Фильтрация нескольких атрибутов, лучшая практика в решении для электронной торговли
Структура данных (Simple много-ко-многим):
ProductAttribute Table
------
ProductId
AttributeId
Attribute Table
-------
AttributeId
AttributeGroupId
AttributeGroup Table
-------
AttributeGroupId
Основная проблема здесь состоит в том, что на стороне клиента, они могут выбрать столько фильтров, сколько они хотят. Однако для каждого атрибута в группе это своего рода «или» выбор, в то время как атрибуты в других группах - «и».
Пример: AttributeGroup Цвет: красный, зеленый AttributeGroup Длина: Длинные AttributeGroup Материал: шелк, лен
Поэтому в основном я должен вернуть все продукты, которые соответствуют Красный/Long/шелк, красный/Long/Linen , Зеленый/длинный/шелковый, зеленый/длинный/льняной.
В настоящее время хранимые процедуры анализируют каждую из этих групп индивидуально в советском стиле, сверхдолгий процесс, который выполняет свою работу. Сначала создайте временную таблицу productIds, которая соответствует первой группе (цвет), а затем удалите идентификаторы, которые не соответствуют последовательным фильтрам AttributeGroup. Пример: Дайте мне все красные и зеленые продукты. Затем удалите любые продукты, которые также не являются «длинными». Теперь удалите оставшиеся продукты, которые также не являются Linen или Silk.
Прок работает довольно хорошо, но теперь, когда этот сезон занят на нас, он, похоже, не очень хорошо масштабируется, и я стараюсь повысить его эффективность. В каждой группе может быть до 12 разных групп и множество разных атрибутов.
Данные могут передаваться любым способом, но в настоящее время это строка с несколькими разделителями, которая анализируется в таблице с использованием функции sql. AttributeGroupId-AttributeId, AttributeId | AttributeGroupId-AttributeId, AttributeId Пример: 1-104,114 | 2-125,140 | 3-215,317
EDIT: Пример того, как входные данные разобраны
AttributeGroupId| Attribute Id
------------------------------
1 | 104
1 | 114
2 | 125
2 | 140
3 | 215
3 | 317
Не вдаваясь глубоко в текущие процедуры, любые рекомендации о том, как лучше всего решить эту проблему?
без деталей о реализации, как может кто-нибудь предложить любую помощь, чтобы улучшить производительность? –
Если атрибут AttributeId уникален, атрибут AttributeGroupID бессмыслен в поисковой программе. Похоже, вам просто нужен список AttributeId, так как это то, что связано с продуктом. «Дайте мне все продукты, включенные в этот список атрибутов». –
Я бы хотел перепроектировать его, так как его реализация в настоящее время не имеет большого значения. – citizenkraft