电子商务的产品属性数据库结构

时间:2020-02-24 22:15:36

标签: sql database mongodb database-design

背景故事:

我正在构建一个电子商务Web应用程序(在线商店) 现在我要选择数据库系统和适当的设计。 我被困在为产品属性开发设计上

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

我需要您的建议和帮助

问题:

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

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

enter image description here




问题

哪种方法最适合此类问题?我在下面介绍了一些内容,但也许您对此有自己的看法


MongoDB

可能的解决方案:

您可以非常容易地实现这种产品属性结构。

您可以为每个产品创建一个具有字段属性的集合,然后将所需内容放置在此处,就像它们在此处建议的那样(字段“详细信息”):

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

结构将是

enter image description here

问题:

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

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

SQL

诸如单个表之类的解决方案将所有产品存储在一个表中,最终您获得的字段数等于所有产品合在一起的属性号。

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

但是我不会考虑这些。一个非常庞大,而另一个则不太灵活,需要动态方案设计

可能的解决方案

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

我们的架构为:

EAV enter image description here

这样的设计可以在MongoDB系统上完成,但是我不确定它是针对这种规范化的结构

问题

模式将变得非常庞大,很难查询和掌握

1 个答案:

答案 0 :(得分:0)

如果选择SQL数据库,请查看PostgreSQL which supports JSON features。不一定需要遵循tree$Asia$Azerbaijan$path

如果选择MongoDB,则需要使用通用Database normalization对存储attrs数组。

{key:"field", value:"value"}

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

{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

MongoPlayground