最近没有怎么写MongoDB的部分,本周开始连续的搞MongoDB的部分,搞一个MongoDB宣传系列,系列将主要聚焦在MongoDB的核心,设计与建模部分。
建模与设计
在本人8年的MongoDB的工作和学习中,已经深刻理解到MongoDB的精髓,设计,设计,还是TM的设计。在去年MongoDB的CTO,技术负责人在MongoDB的大会上的轰炸式的宣传中,提高MongoDB的性能的方式或者说重点,已经深入人心。那就是MongoDB的设计,在理解业务后,如何设计出一个适合当前业务的“集合”结构,对于提高MongoDB是非常重要的,这点传统的DBA可能有这个意识,但无法理解其中的玄妙。
本系列将探讨的是
1 更好的迎接面向对象的继承性和多态性
2 在模式之间迁移如何更简单,让应用停机的时间更少
3 更好的支持结构化的数据
4 基于基本操作的复杂更新
5 如何利用传统数据库经常谈到的,两阶段提交协议在MongoDB中应用乐观更新的模式
如果你从未接触过MongoDB,那么你将开启听天书的模式,坐好,抓紧你身边的扶手,系紧安全带发车了。
1 今天我们讨论,MongoDB 如何更好的迎接面向对象的继承性和多态性
首先我们统一思想,MongoDB是一个彻头彻尾的“无模式”数据库,这决定了MongoDB中的集合--“表”并不强制每行数据的结构是一致的。那么什么是多态性,这里指的是,在大部分行都具有相同的属性,但又有自己的特殊的属性的情况下,我们称之为,多态性。
在传统的数据库中,无论你是ORACLE, SQL SERVER, MYSQL,还是现在最红的PostgreSQL,在表设计中,统统逃不过一个命运,在设计中要不进行表集成方式的设计,要不就进行单表集成模式的设计,术语--范式。
当然在MongoDB出现之前,一些想要摆脱这些数据库在设计上的限制,出现了一种设计的模式,实体--属性--值 的方式来进行表的设计,我们举一个简单的例子
实体 ID (Entity ID) | 属性 ID (Attribute ID) | 值 (Value) |
---|---|---|
1 | 1 车身 | 掀背 |
1 | 2 (尺寸) | B 级别 |
1 | 3 (价格) | $288,000 |
2 | 1 (颜色) | 蓝色 |
2 | 3 (价格) | $300,000 |
2 | 2 (尺寸) | C级别 |
这样的方式有什么好处,主要就是灵活,将传统数据库的固定模式,列转行。将表的结构数据化。 缺点也是显而易见的:
1 查询复杂
2 数据类型处理麻烦(还是传统数据库的罪过)
3 索引的效率低下
4 数据的完整性难以保证
基于EAV 模式的需求,这就是产生MONOGDB的一部分原因,让数据存储运算更加的灵活,但还保留数据库的特性,我想着就是MongoDB最早的初衷,或许这是一群爱自由的人。
那么有人会说,到底MongoDB的多态性,有什么好处? 我们举一些例子
好处可以总结为
1 简化数据模型: 无需为每种类型的实体创建单独的集合。可以将所有相关的实体存储在同一个集合中,通过一个公共字段(通常称为“类型”或“类别”)来区分不同的实体类型。这简化了数据模型,减少了集合的数量,使数据库更易于管理。
2 提高查询效率: 当需要查询所有类型的实体时,只需在一个集合上进行查询,而不需要在多个集合之间进行连接(Join)操作。连接操作在关系型数据库中是常见的性能瓶颈,而 MongoDB 通过多态性避免了这个问题,从而提高了查询效率。
3 方便应用程序开发: 应用程序可以更方便地处理不同类型的实体。可以根据文档中的类型字段来决定如何处理该文档,例如使用不同的类或函数来处理不同类型的实体。
4 易于扩展和修改: 当需要添加新的实体类型时,只需在集合中添加新的文档,并为其指定新的类型值即可,无需修改集合的 schema。这使得数据库更容易扩展和适应变化的需求。
此时应该有人跳出来,给一句! 说人话,你上面的我看不懂
那咱们就用最朴实无华的语言进行描述
1 原来咱们二维关系型数据库都是包子,把那个数据库包到皮里面,MongoDB可以理解为披萨,你想吃什么,就往那个面饼上放馅料,放多少吃多少。
2 原来包子里面的馅料比较均匀,每个包子里面都的有一个虾仁,现在MongoDB大披萨可不是,你做四种馅料在一个面饼上都可以,你可以是4分之一的,牛肉芝士,4分之一的奥尔良鸡肉,4分之一的夏威夷水果,4分之一的泰国榴莲。
3 原来你吃包子,你的分馅料,你吃一个猪肉三鲜的,他一定不能是牛肉西葫的,这披萨可不是,这口是肉的,下一口可能就是菠萝,具体看你咬哪里了
4 这包子你在大你能有包子屉大,这披萨可不是,你要多大咱们就马上让他变大,这张6寸,下张就10寸,扩展性刚刚的。
你看说着说着,说饿了,咱们看一下下面的一个例子,基于Json的格式,我们每个collection 都看着和其他的类似,但有自己独有的东西,你就像下面这个例子,一推的运动员登记表,里面可能有一半人,比赛完没有成绩,而另一半人有成绩,在传统数据库上怎么办,你就的有一半的成绩在这个列,都是NULL,可MongoDB不用,没有就不写就好了。
[
{
"_id": ObjectId("..."),
"type": "footballer",
"name": "Lionel Messi",
"age": 36,
"country": "Argentina",
"goals": 800,
"assists": 350
},
{
"_id": ObjectId("..."),
"type": "basketballer",
"name": "LeBron James",
"age": 38,
"country": "USA",
"points": 38000,
"rebounds": 10000,
"assists": 10000
},
{
"_id": ObjectId("..."),
"type": "swimmer",
"name": "Michael Phelps",
"age": 38,
"country": "USA",
"style": "Butterfly",
"best_time": "49.82s"
}
]
当然他本身也有主键,基于分布式的概念,这里大家记住,最好使用MongoDB自己给你的主键 ObjectID 作为默认的物理主键,如果你想要自己弄一个主键也不是不可以,建议你就在objectID
建立一个collection的唯一索引就可以了。
本文分享自 AustinDatabases 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!