利用模式进行构建第二讲——属性模式

38 篇文章 0 订阅

在MongoDB University

学习更多关于MongoDB的知识和技能

欢迎大家回来学习利用模式进行构建的系列课程。上一次,我们了解了多态模式,这种模式针对的情况是:某个集合中所有文档的结构均类似,但并不完全相同。在本篇博文中我们将了解属性模式。属性模式特别适合以下场合:


  • 我们有一些大文档,这些文档有很多相似的字段,但同时存在一个享有共同特征的字段子集,我们希望对字段子集进行分类或查询

  • 或者我们需要分类的字段只存在于一个较小的文档子集之中

  • 或者文档同时具备以上两个条件。


由于性能方面的原因,为了优化搜索效果,我们可能需要很多索引以涵盖所有子集。但创建全部索引可能会降低性能。对于这种情况,属性模式提供了一种很好的解决方案。


属性模式

让我们考虑一下电影文件的数据采集集合。所有这些文档都可能包含相类似的字段:片名、导演、制片人、演员表等。假设我们希望搜索发行日期,我们在做这件事时会遇到一个挑战:究竟需要哪个发行日期?通常来说,一部电影在不同国家的发行日期各不相同。

为搜索发行日期,可能需要立刻查找很多字段。为能快速搜索到发行日期,在我们采集电影文件时可能需要几个索引:

利用属性模式,我们能够将信息子集转移到一个数组中,并减少创建索引的数量。我们将该信息转换为键值对数组:

然后通过创建一个针对数组中元素的索引,使编制索引变得易于管理:{ "releases.location": 1, "releases.date": 1}


利用属性模式,我们可以对具有某些共同特征但同时又包含稀有或不可预知字段的文档进行组织。例如,一部电影在某个新设立的节日或较小的节日发行的情况。此外,转移到键/值表达还可以支持非确定性的命名方式,并且容易添加限定符。例如,如果我们的数据采集集合是关于瓶装水的,其属性有可能如下所示:

这里我们将信息拆分为键和数值,”k”和”v”,并增加第三个字段”u”,用于单独保存测量单位。


应用场景示例

一些结构模式包含的字段集具有相同的数值类型(例如,日期列表),属性模式非常适用于这种情况。该模式也很适用于产品特性的处理。某些产品如服装,尺寸可能用小号、中号和大号表示。同一批采集集合中的其他产品可以用体积表示,还有一些产品则可以用物理尺寸或重量表示。


我们的一个资产管理领域的客户最近利用属性模式部署了一种解决方案。该客户使用这种模式存储了一批给定资产的所有特性。这批资产很少存在共同特征,或者很难在设计阶段预测。关系模型通常会采用复杂的设计过程并通过用户自定义字段的形式表达相同的理念。


尽管产品目录中的很多字段都类似(例如:名称、供应商、生产商、原产国等等),但产品的规格或属性可能不一样。如果你的应用和数据访问模式需要立刻对这些不同字段进行全面搜索,那么,属性模式能够提供很好的数据结构。


结论

针对每个文档存在很多相同字段的情况,属性模式提供了一种更为便捷的方式,用以编制文档索引。通过将数据子集转换为键/值子文档,我们能够采用非确定性的字段名,并将额外的限定符添加到信息中,从而更清晰地表述原始字段和数值之间的关系。如果采用属性模式,我们需要的索引会更少,查询语句也会变得更易于编写,从而使查询变得更为快捷。


我们将要探讨的下一种模式是桶式设计模式。


MongoDB数据库

MongoDB官方公众号

扫描关注,

获取更多精彩内容


如果您有任何问题,欢迎留言!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值