Open AurorePaladin opened 2 years ago
数据模型就是通过创建一个逻辑化、物理化的模型,来提供一个同一个层面交流的目的。
注意: 在关系型数据库设计中,遵循第三范式原则:数据库在库里尽量不可能存在冗余。 例如“联系人地址”中,要将地址里的省份、城市、区县进行单独存储,因为多个联系人地址中该部分为共有。
注意: 以上所谓3步曲,本质上是 MongoDB 文档模型设计优化进阶的三个阶段。
业务需求及逻辑模型 ——> 逻辑导向 ——> 基础建模 ——> {集合、字段、基础形状} 注意: MongoDB单个文档大小不能超过16MB
业务需求及逻辑模型 ——> 逻辑导向 ——> 基础建模 ——> {集合、字段、基础形状}
注意: MongoDB单个文档大小不能超过16MB
读写工况场景:
基于内嵌的文档模型,根据业务需求:
技术需求、读写比例、方式及数量 ——> 技术导向 ——> 工况细化 ——> {引用及关联}
文档模型:无范式,无思维定式,充分发挥想象力 设计模式:实战过屡试不爽的设计技巧,快速应用
举例:一个loT(物联网)场景的分桶设计模式,可以帮助把储存空间降低10倍并且查询效率提升数10倍。 分桶设计模式:可以将每分钟为一条数据通过文档内嵌数组,改为每一小时为一条数据。减少文档数量,减少索引占用空间。
经验和学习 ——> 模式导向 ——> 套用设计模式 ——> {最终模式}
场景:大文档,很多字段,很多索引 举例:一部电影在几十个国家的不同上映日期,例如美国上映日期对应的字段 release_USE:"2020/06/02"、在中轨上映日期对应的字段 release_CN:"2020/06/01" ...
解决方案:列转行
最终数据结构:
{ releases:[ {country:"USA",date:"2020/06/02"}, {country:"CN",date:"2020/06/01"} ] }
修改之后的文档模型,总体字段变少了,国家和上映日期都被储存在 releases 这1个字段中,利于提高查询效率。
列转行设计模式优点:将多个字段转化为一个字段上的数组元素,一个索引解决所有查询问题。
场景:文档模型灵活了,如何管理文档不同版本? 举例:6月份以后需要在数据中新增一个字段 wechat,而这个字段是在之前的数据中不存在的。而预计下个月还会要新增别的字段,最终导致一个集合中的数据字段很多地方不相同。
解决方案:文档版本
文档版本设计模式方案优点:通过增加一个版本号字段,可以区分不同文档所具有的数据格式。数据库升级时可以快速过滤掉不需要升级的文档,或升级时对不同版本的文档做不同的处理。
问题:数据写入量大,读取量小,写入太频繁消耗系统资源 举例:统计网页点击流量,每访问一个页面都会产生一次数据库技术更新操作。统计数字准确性要求并不是特别重要,不需要特别精确
解决方案:近似计算
近似计算设计模式优点:间隔写入,每隔10次或100次写入一次,每次写入统计+10或+100,大量减少写入次数。
注意: 近似计算的前提是对统计要求不需要那么精准,例如网页流量统计,若需要精准统计则近似计算无法满足。
问题:排名,商品统计等精确统计 举例:热销榜(日/周/月)、电影排行榜
传统解决方案:通过聚合计算 缺点:消耗资源多,聚合计算时间长
解决方案:用预聚合字段
注意: 预聚合使用 $inc
MongoDB文档模型设计
什么是数据模型?
数据模型就是通过创建一个逻辑化、物理化的模型,来提供一个同一个层面交流的目的。
数据模型设计的元素
实体(Entity)
属性(Attribute)
关系(Relationship)
数据模型设计基础
传统模型设计:从概念到逻辑到物理
MongoDB文档模型设计的三个误区
关于JSON 文档模型设计
为什么人们都说MongodDB是无模式?
文档模型的设计原则:性能和易用
关系模型 VS 文档模型
MongoDB文档模型设计三步曲
第1步:建立基础文档模型
第2步:根据读写工况细化
读写工况场景:
基于内嵌的文档模型,根据业务需求:
什么时候应该使用引用方式?
MongoDB引用设计的显示
第3步:套用设计模式
文档模型:无范式,无思维定式,充分发挥想象力
设计模式:实战过屡试不爽的设计技巧,快速应用
举例:一个loT(物联网)场景的分桶设计模式,可以帮助把储存空间降低10倍并且查询效率提升数10倍。
分桶设计模式:可以将每分钟为一条数据通过文档内嵌数组,改为每一小时为一条数据。减少文档数量,减少索引占用空间。
MongoDB设计模式
MongoDB设计模式集锦
列转行
场景:大文档,很多字段,很多索引 举例:一部电影在几十个国家的不同上映日期,例如美国上映日期对应的字段 release_USE:"2020/06/02"、在中轨上映日期对应的字段 release_CN:"2020/06/01" ...
解决方案:列转行
最终数据结构:
修改之后的文档模型,总体字段变少了,国家和上映日期都被储存在 releases 这1个字段中,利于提高查询效率。
列转行设计模式优点:将多个字段转化为一个字段上的数组元素,一个索引解决所有查询问题。
文档版本
场景:文档模型灵活了,如何管理文档不同版本?
举例:6月份以后需要在数据中新增一个字段 wechat,而这个字段是在之前的数据中不存在的。而预计下个月还会要新增别的字段,最终导致一个集合中的数据字段很多地方不相同。
解决方案:文档版本
文档版本设计模式方案优点:通过增加一个版本号字段,可以区分不同文档所具有的数据格式。数据库升级时可以快速过滤掉不需要升级的文档,或升级时对不同版本的文档做不同的处理。
近似计算
问题:数据写入量大,读取量小,写入太频繁消耗系统资源
举例:统计网页点击流量,每访问一个页面都会产生一次数据库技术更新操作。统计数字准确性要求并不是特别重要,不需要特别精确
解决方案:近似计算
近似计算设计模式优点:间隔写入,每隔10次或100次写入一次,每次写入统计+10或+100,大量减少写入次数。
问题:排名,商品统计等精确统计
举例:热销榜(日/周/月)、电影排行榜
传统解决方案:通过聚合计算
缺点:消耗资源多,聚合计算时间长
解决方案:用预聚合字段