Атрибуты продукта структура базы данных для электронной коммерции - PullRequest
0 голосов
/ 25 февраля 2020

Предыстория:

Я создаю веб-приложение для электронной коммерции (интернет-магазин). Теперь я подошел к выбору системы баз данных и подходящего дизайна. Я застрял с разработкой дизайна атрибутов продукта

Я думал о выборе систем баз данных No SQL (MongoDB) или SQL

Мне нужны ваши советы и помощь

Проблема:

Когда вы выбираете тип продукта (например, таблицу), он должен показывать вам соответствующие фильтры для такого типа (например, высота, материал и т. Д. c). ). Когда вы выбираете другой тип, скажем, «автомобиль», он предоставляет вам атрибуты фильтра автомобиля c (например, топливо, объем двигателя)

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

enter image description here




Вопрос

Какой подход является лучшим для такой проблемы? Я описал некоторые из них ниже, но, возможно, у вас есть свои собственные мысли относительно этого


MongoDB

Возможное решение:

Вы можете довольно легко реализовать такую ​​структуру атрибутов продукта.

Вы можете создать одну коллекцию с полями атрибутов для каждого продукта и поместить туда все, что захотите, как они предлагают здесь (поле "детали") ):

https://docs.mongodb.com/ecosystem/use-cases/product-catalog/#non -реляционная модель данных

Структура будет

enter image description here

Проблема:

При таком решении у вас вообще нет типов продуктов, поэтому вы не можете отфильтровать продукты по их типам. Каждый продукт содержит свою собственную произвольную структуру в поле attrs и не следует какой-либо схеме

И, может быть, я могу каким-то образом go с этим подходом?

SQL

Существуют такие решения, как одна таблица, в которой все продукты хранятся в одной таблице, и в результате вы получаете столько полей, сколько и номер атрибута всех продуктов, взятых вместе.

Или для каждого типа продукта Вы создаете новую таблицу

Но я не буду рассматривать эти. Один очень громоздкий, а другой не очень гибкий и требует динамической c схемы

Возможное решение

Существует одно довольно гибкое решение, называемое EAV https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model

Наша схема будет:

EAV enter image description here

Такой дизайн может быть сделано в системе MongoDB, но я не уверен, что она была сделана для такой нормализованной структуры

Задача

Схема станет действительно огромной и действительно трудно запросить и gr asp

1 Ответ

0 голосов
/ 25 февраля 2020

Если вы выберете SQL базу данных, посмотрите PostgreSQL, которая поддерживает JSON функции . Не обязательно вам нужно следовать Database normalization.

Если вы выбираете MongoDB, вам нужно хранить массив attrs с родовыми c {key:"field", value:"value"} парами.

{id:1, attrs:[{key: "prime", value: true}, {key:"height", value:2}, {key:"material", value:"wood"},{key:"color", "value":"brown"}]}
{id:2, attrs:[{key: "prime", value: true}, {key:"fuel", value:"gas"}, {key:"volume", "value":3}]}
{id:3, attrs:[{key: "prime", value: true}, {key:"fuel", value:"diesel"}, {key:"volume", "value":1.5}]}

Тогда вы определить индекс с несколькими ключами следующим образом:

db.collection.createIndex({"attrs.key":1, "attrs.value":1})

Если вы хотите применить пошаговые фильтры, используйте агрегацию MongoDB с оператором $elemMatch

☑ Prime
☑ Fuel
☐ Other

...

☑ Volume 3
☐ Volume 1.5

Представление запроса

db.collection.aggregate([
  {
    $match: {
      $and: [
        {
          attrs: {
            $elemMatch: {
              key: "prime",
              value: true
            }
          }
        },
        {
          attrs: {
            $elemMatch: {
              key: "fuel"
            }
          }
        },
        {
          attrs: {
            $elemMatch: {
              key: "volume",
              "value": 3
            }
          }
        }
      ]
    }
  }
])

MongoPlayground

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...