文档模型设计之三:套用设计模式
-
文档模型:无范式,无思维定式,充分发挥想象力。
-
设计模式:实战过程屡试不爽的设计技巧,快速应用。
-
举例:一个 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的设计模式:
表现形式类 数据访问类 组织结构类 列转行 子集 分桶 文档版本 近似处理 预聚合