Создание настраиваемого каталога товаров на заказ в базе данных документов

#database-design #nosql

#база данных-дизайн #nosql

Вопрос:

Моим первоначальным намерением было задать этот вопрос для MongoDB, но я быстро понял, что этот вопрос, вероятно, относится к другим базам данных, ориентированным на документы, таким как CouchDB и другие. Мне трудно разобраться в создании каталога продуктов, который поддерживает продукты, изготовленные на заказ. Вот базовый набор задач для каталога:

  1. Каждый продукт имеет настраиваемый набор опций. Такие вещи, как материалы, используемые для производства продукта, или цвета, которые на них напечатаны. Некоторые параметры делают доступными другие параметры, почему некоторые параметры ограничивают доступность других параметров.
  2. Цены варьируются от опции к опции, для некоторых опций это процент от базовой цены, а для других это фиксированная сумма.
  3. Существует также аспект специальных цен. У нас могут быть контракты с различными другими компаниями, которые предоставляют специализированные цены на ряд продуктов. Мы часто предлагаем промо-коды и скидки как в строке, так и в заголовке заказа.

В конечном счете, самая сложная часть для понимания — это общая схема для записи продукта. Должен ли я делать что-то вроде:

     {
        "Product_Name": "Test Product 1",
        "Product_Number": "P00001",
        "BasePrice":"10",
        "AvailableSize":
        [
            {
               "Length":"1","Width":"1",
               "PriceType":"PercentOnBase",
               "Price":"5"
            },
            {
               "Length":"1","Width":"2",
               "PriceType":"PercentOnBase",
               "Price":"6"
            },
            {
               "Length":"2","Width":"2",
               "PriceType":"PercentOnBase",
               "Price":"7.5"
            },
            {
               "Length":"2","Width":"3",
               "PriceType":"PercentOnBase",
               "Price":"10"
            },
            {
               "Length":"3","Width":"3",
               "PriceType":"PercentOnBase",
               "Price":"15"
            }
        ],
        "AvailableNumberImprints":
        [
            {
               "ImprintNumber":"1",
               "PriceType":"PercentOnBase",
               "Price":"10"
            },
            {
               "ImprintNumber":"2",
               "PriceType":"PercentOnBase",
               "Price":"12"
            },
            {
               "ImprintNumber":"3",
               "PriceType":"PercentOnBase",
               "Price":"14"
            },
            {
               "ImprintNumber":"4",
               "PriceType":"PercentOnBase",
               "Price":"16"
            },
            {
               "ImprintNumber":"5",
               "PriceType":"PercentOnBase",
               "Price":"17"
            },
            {
               "ImprintNumber":"6",
               "PriceType":"PercentOnBase",
               "Price":"20"
            },                      
        ],
            "AvailableMaterials":
        [
            {
               "MaterialName" : "Black",
               "MaterialNumber": "M00001",
               "PriceType":"PercentageOnBase",
               "Price":"5"
            }
            {
               "MaterialName" : "White",
               "MaterialNumber": "M00002",
               "PriceType":"PercentageOnBase",
               "Price":"5"
            }
            {
               "MaterialName" : "Pearl",
               "MaterialNumber": "M00003",
               "PriceType":"PercentageOnBase",
               "Price":"5"
            }
            {
               "MaterialName" : "Green",
               "MaterialNumber": "M00004",
               "PriceType":"PercentageOnBase",
               "Price":"5"
            }
        ]
    }
  

Проблема, с которой я быстро сталкиваюсь, заключается в том, что это несколько затрудняет ограничение других опций, не будучи чрезмерно избыточным. Есть мысли?