Open FS1360472174 opened 8 years ago
datamodel 主要的挑战是平衡应用的需求,db储存的性能,数据产生的模式。
document结构 document关联关系有两种:
2.Embedded Data(嵌套) 反规范化数据模型
写操作的原子性 写操作原子性在单个document level.
所以反规范化数据模型某种程度上提供了事务来控制了多个表的数据插入。
document 增长 对于MMAPv1存储引擎,如果文档大小超过了分配的空间, 会在磁盘上重新分配。当使用MMAPv1存储时,document增长是 决定规范化,还是反规范化数据的一个因素。
数据使用和性能 设计一个data model,需要考虑应用程序如何使用你的database.比如 如果只使用最近插入的数据,可以考虑使用Capped Collections.
如果应用程序主要是读操作,加indexes提高性能。
mongo提供数据的验证
db.createCollection( "contacts", { validator: { $or: [ { phone: { $type: "string" } }, { email: { $regex: /@mongodb\.com$/ } }, { status: { $in: [ "Unknown", "Incomplete" ] } } ] } } )
甚至可以是正则表达式,当数据插入,更新时可以进行校验。
影响 已有的数据不会在你设置验证条件时进行校验,只有当对数据进行更改时才会。 对已有数据的校验级别可以设置。默认的validationLevel是strict。就是MongoDb会对 所有的inserts 和update实行校验。如果设置为moderate,.则只会应用到满足条件的insert和update
不能对admin,local,config,system database 设置验证
1.嵌套document 优点:查性能好
缺点: document 增长影响写性能(???影响什么的写性能) 导致数据分散(基于MMAPv1储存引擎,Mongo3.0.0 以后,使用Power of 2 Sized Allocation.) 另外,如果query是返回整个json。那数据量也会过大
2.引用 case: 1.当嵌套会导致数据冗余,但是又不能提供充分的读性能去弥补数据的冗余
2.更加复杂的多对多的关系
3.对更大层级的数据集建模
data model 的设计好坏直接影响到read,write性能。可能影响的因素
2.Atomicity 只有单个document才有原子性
3.sharding 水平扩展,需要定义shard key
4.indexes index 代价: 1.需要至少8KB的数据空间 2.影响写性能 query性能分析
5.大量的collections 大体来说,大量的collections并没有什么性能损失,同时会带来好的性能。 但是namespace可能会有限制
6.collection包含大量的小document 需要考虑是不是要将这些小的document组成一个大的 7.数据生命周期管理 可以使用TTL,
但是出版社与书,这个是没有上限的。就会考虑使用collection之间的关联关系来解决。
Model Data 去支持关键词搜索
关键词搜素和文本搜索,全文本搜索不一样。 这个功能比较鸡肋,没什么用
model 金融数据
https://docs.mongodb.com/manual/core/data-modeling-introduction/