MongoDB 数据模型(5/5)三部曲三、套用设计模式

文档模型设计之三:套用设计模式


  • 文档模型:无范式,无思维定式,充分发挥想象力。

  • 设计模式:实战过程屡试不爽的设计技巧,快速应用。

  • 举例:一个 loT 场景的分桶设计模式,可以帮助把存储空间降低10倍并且查询效率提升数十倍。

  • {
    	"_id": "20160101050000:CA2790",
    	"icao": "CA2790",
    	"callsign": "CA2790",
    	"ts": ISODate("2016-01-01T05:00:00.000+0000"),
    	"event": {
    		"a":31418,
    		"b":173,
    		"p":[115,-134],
    		"s":91,
    		"v":80
    	}
    }
    
  • 假设有 520亿条,10TB - 海量数据

    • 10 万架飞机

    • 1 年的数据

    • 每分钟一条

      • 分桶前 每分钟1条
        文档条数 52.6 B
        (100,000 * 365 * 24 * 60)
        索引大小 6364 GB
        (52.6 B * 130)
        _id index 1468 GB
        {deviceid: 1, ts: 1} 4895 GB
        文档平均大小 92 Bytes
        数据大小 4503 GB
        (52.6 B * 92)
  • 解决方案:分桶设计

{ # 每个文档存放一架飞机一小时的数据。
  	"_id": "20160101050000:CA2790",
  	"icao": "CA2790",
  	"callsign": "CA2790",
  	"ts": ISODate("2016-01-01T05:00:00.000+0000"),
  	"events": [
      {
        "a":21418,"b":319,"p":[14,-134],"s":191,
        "v":80,"t":ISODate("2016-01-01T05:00:00.000+0000")
      },
      {
      	"a":25563,"b":173,"p":[115,-124],"s":391,13    
        "v":80,"t":ISODate("2016-01-01T05:00:01.000+0000") # 60 events = 1小时数据
      },
  	]
  }	
分桶后 每分钟1个 每小时1个文档
文档条数 52.6 B
(100,000 * 365 * 24 * 60)
876M
(100,000 * 365 * 24)
索引大小 6364 GB
(52.6 B * 130)
106 GB
_id index 1468 GB 24.5 GB
{deviceid: 1, ts: 1} 4895 GB 81.6 GB
文档平均大小 92 Bytes 758 Bytes
数据大小 4503 GB
(52.6 B * 92)
618 GB
  • 模式小结:分桶

    场景 痛点 设计模式的方案及优点
    时序数据
    物联网
    智慧城市
    智慧交通
    数据点采集频繁,数据量太多。 利用文档内嵌数组,将一个时间段的数据聚合到一个文档里。
    大量减少文档条数。
    大量减少索引占用空间。
  • 一个好的设计模式可以显著地 提升数据读写的效率降低资源的需求

  • 更多MongoDB的设计模式:

    表现形式类 数据访问类 组织结构类
    列转行 子集 分桶
    文档版本 近似处理 预聚合
原文地址:https://www.cnblogs.com/sweetXiaoma/p/14596060.html