前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >MongoDB 大俗大雅,高端的知识讲“低俗” -- 1 什么叫多模

MongoDB 大俗大雅,高端的知识讲“低俗” -- 1 什么叫多模

作者头像
AustinDatabases
发布2025-01-13 14:36:39
发布2025-01-13 14:36:39
6800
代码可运行
举报
文章被收录于专栏:AustinDatabasesAustinDatabases
运行总次数:0
代码可运行

最近没有怎么写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不用,没有就不写就好了。

代码语言:javascript
代码运行次数:0
复制
[
  {
    "_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的唯一索引就可以了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档