Database 面向产品比较的数据库模式设计
Database 面向产品比较的数据库模式设计,database,mongodb,database-design,database-schema,mongoose-schema,Database,Mongodb,Database Design,Database Schema,Mongoose Schema,我希望设计一个数据库模式来比较两个产品。像这样的
以下是我对数据库模式设计的想法(只能比较同类产品,请注意数据库是mongodb):
类别表标记产品的类别
将与类别对应的所有要素存储在“类别”表中
在
产品表存储一个
每个要素,其中键是要素名称,值是
产品和类别\u功能\u id中的此功能是
类别表中的要素id
然而,这使得product表与categories表紧密耦合。以前有人解决过这样的问题吗?任何指点都将不胜感激。以下是架构的概述:
categories collection:
nam
我希望设计一个数据库模式来比较两个产品。像这样的
以下是我对数据库模式设计的想法(只能比较同类产品,请注意数据库是mongodb):
类别表标记产品的类别
将与类别对应的所有要素存储在“类别”表中
在
产品表存储一个
每个要素,其中键是要素名称,值是
产品和类别\u功能\u id中的此功能是
类别表中的要素id
然而,这使得product表与categories表紧密耦合。以前有人解决过这样的问题吗?任何指点都将不胜感激。以下是架构的概述:
categories collection:
name: 'String'
features: [
{
name: 'string'
parent_id: 'ObjectID' // if this is a sub feature it will reference in this // embedded document itself
}
]
products:
name: 'String'
features: [ // Embedded document with feature values
{
name: 'String',
value: Boolean,
category_feature_id: 'ObjectID' // feature_id into the categories.features // table, majorly used to comparison only.
}
]
我会考虑将特征集单独收集,对于每一个类别或产品,都有一个特征ID列表。例如:
Features collection:
{id: XXX, name: A}, {id: YYY, name: B}
Categories collection:
{ features: [featureId: XXX, value: C]}
Products collection:
{ features: [featureId: YYY, value: D]}
这有几个优点:
从概念上讲,我认为功能是独立于两者的
类别和产品。除非你确定有两类
将永远不会共享功能,那么您就不应该有重复的功能
单个要素的定义。否则,如果你想
稍后更新功能(例如,其名称或其他属性),然后
这样做会很痛苦
这使得将功能绑定到
产品和/或类别没有与客户紧密耦合
每个类别内的定义
如果您愿意,这允许您通过包括
类别和特定产品中的相同功能。你可以
决定这种情况对你意味着什么。但有一种方法可以定义这一点
条件是特征的产品定义取代
类别定义,使模式非常灵活
它
允许用户跨类别和类别搜索单个功能
产品。例如,将来,您可能希望允许用户
跨多个类别和产品搜索特定颜色。
将要素视为一级对象将允许您这样做
无需通过翻译用户请求来回避它
进入多个类别特征id
您不需要category\u feature\u id字段,因为每个功能在产品和类别中都具有相同的id,因此很容易在产品和类别之间进行引用
无论如何,这是我的建议。如果在categories和products集合中向features数组添加索引,那么执行诸如查找、连接、过滤器等db操作将非常快
编辑(回应您的评论):
对特征名称进行非规范化的决策与在何处存储特征记录的决策是正交的。让我来翻译一下:-)
规范化数据意味着您只保留任何数据的一个副本,然后在需要时引用该数据。这样,数据只有一个确定的来源,并且您不会遇到数据的不同副本最终被更改并且不再一致的问题
在关系理论下,您希望尽可能规范化数据,因为这是维护一致性的最简单方法。例如,如果你只有一个地方记录一个客户地址,你永远不会遇到这样的情况:你有两个地址,你不知道哪一个是正确的。然而,出于性能原因,人们经常对数据进行非规范化处理,即避免昂贵和/或频繁的查询。取消数据规范化的决定必须权衡性能优势与手动维护数据一致性的成本(现在必须编写应用程序代码,以确保数据的各个副本在其中任何一个得到更新时保持一致)
这就是我所说的去规范化与数据结构正交的意思:选择最有意义的数据结构来准确地表示数据。然后,出于性能原因,您有选择地对其进行反规范化。当然,如果不考虑性能影响,您不会选择最终的数据结构,但从概念上讲,它们是两个不同的目标。这有意义吗
请让我们看看你的例子。当前,可以将功能名称从类别功能列表复制到产品功能列表。这是一种非规范化。它允许您避免在每次需要列出产品时查询类别集合。您需要在性能优势与数据一致性问题之间取得平衡。因为现在,如果有人更改了产品或类别记录中的名称,您需要有应用程序代码来手动更新另一个集合中的相应记录。如果您在类别端更改名称,则可能需要更改数百条产品记录
我假设您仔细考虑了这些权衡,并相信去规范化的性能优势是值得的。如果是这种情况,那么也没有什么可以阻止您从单独的特征集合进行反规范化。只需将功能集合中的名称复制到类别或产品文档中即可。您仍然可以获得我列出的所有优势,并且性能不会比您当前的系统差
OTOH,如果您没有考虑到性能优势,只是因为“noSQL不做连接”而遵循这个范例,那么我的建议是不要那么武断您可以非常快速地在MongoDB中进行连接,就像您可以非常轻松地对SQL表中的数据进行非规范化一样。这些不是硬性规定
FWIW,IMHO,我认为避免简单查询的去规范化是过早优化的一种情况。除非您的网站每秒提供超过10k个产品页面,以及每秒超过1k个插入或更新,从而导致大量锁定延迟,否则,您需要对功能进行额外的读取查询