【问题标题】:Product attributes db structure for e-commerce电子商务的产品属性数据库结构
【发布时间】:2020-06-08 14:26:38
【问题描述】:

背景故事:

我正在构建一个电子商务网络应用程序(在线商店) 现在我开始选择数据库系统和合适的设计。 我一直在为产品属性开发设计

我一直在考虑选择 NoSQL (MongoDB) 或 SQL 数据库系统

我需要你的建议和帮助

问题:

当您选择产品类型(例如表格)时,它应该会显示该类型的相应过滤器(例如高度、材料等)。当您选择其他类型时,例如“汽车”,它会为您提供汽车特定的过滤器属性(例如燃料、发动机容量)

例如,在一个流行的在线商店中,如果您选择一种数据存储类型,您将获得针对该类型属性的过滤器,例如硬盘驱动器大小或连接类型




问题

哪种方法最适合解决此类问题?我在下面描述了一些,但也许您对此有自己的想法


MongoDB

可能的解决方案:

你可以很容易地实现这样的产品属性结构。

您可以为每个产品创建一个包含字段属性的集合,然后将您想要的任何内容放在那里,就像他们在此处建议的那样(字段“详细信息”):

https://docs.mongodb.com/ecosystem/use-cases/product-catalog/#non-relational-data-model

结构将是

问题:

使用这样的解决方案,您根本没有产品类型,因此您无法按产品类型过滤掉产品。每个产品在 attrs 字段中都包含它自己的任意结构,并且不遵循任何模式

也许我可以采用这种方法?

SQL

有像单表这样的解决方案,其中所有产品都存储在一个表中,您最终会得到与所有产品的属性编号一样多的字段。

或者为每种产品类型创建一个新表

但我不会考虑这些。一个非常笨重,另一个不够灵活,需要动态方案设计

可能的解决方案

有一种非常灵活的解决方案,称为 EAV https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model

我们的架构是:

EAV

这样的设计可能是在 MongoDB 系统上完成的,但我不确定它是为这样一个规范化的结构而设计的

问题

架构将变得非常庞大,并且非常难以查询和掌握

【问题讨论】:

    标签: sql database mongodb database-design


    【解决方案1】:

    如果您选择 SQL 数据库,请查看PostgreSQL which supports JSON features。不一定要关注Database normalization

    如果选择 MongoDB,则需要将 attrs 数组与通用 {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}]}
    

    然后你像这样定义Multi-key index

    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

    【讨论】:

    • 谢谢。但是,我怎样才能只列出某个产品类型的可用过滤器列表呢?
    • 为了获得更好的性能,您可以使用 "key=value" 而不是 { key: "key", value: "value"}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    相关资源
    最近更新 更多