面对Schema free的MongoDB,如何规范你的schema

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:

作为近年最为火热的文档型数据库,MongoDB受到了越来越多人的关注,但是由于国内的MongoDB相关技术分享屈指可数,不少朋友都在抱怨无从下手。本期周李洋为大家分享面对Schema free 的MongoDB时,如何规范你的schema。将从实际应用的角度,并覆盖调优,troubleshooting等方面来进行MongoDB的干货分享,希望能对大家带来帮助。 

目录:

  • MongoDB文档模型带来的好处

  • Variety

  • 我们为什么要用Variety呢?

  • Document Validation

  • validation的限制


如果希望了解更多MongoDB基础的信息,还请大家Google下。我们知道MongoDB是一个文档型数据库,scheme free 是其非常重要的特性,但是在生产中我们应该怎么如合理利用这个特性,合理处理MongoDB的schema呢?


一、MongoDB文档模型带来的好处


大家都知道MongoDB是文档型数据库,是Schema Free的。那么MongoDB的文档模型能给我们带来哪些好处呢,在这简单列举几个:


1、json形式


在MongoDB中,开发人员可以直接将一个json数据存储进MongoDB,这对于开发人员来说是非常友好额;


2、读写性能高


在关系型数据库中,我们经常会进行join、子查询等关联性需求,这时候往往会带来较多的随机IO,而在MongoDB中,我们可以通过合理的数据模型设计来将很多的关联需求通过内嵌、反范式的方式实现,减少了随机IO;


3、schema free


MongoDB的数据模型是灵活的,无需为了Online DDL而操心,不同的document也可以有不同的结构。


在这,我们不深入探究如何对于MongoDB 的Schema进行设计、建模,有关这部分内容,推荐大家可以阅读TJ在开源中国的年终盛典会上分享《MongoDB 进阶模式设计》,以及《Retail Reference Architecture Part 1 to 4 》。


在此我们将主要针对进行了初步建模、并正式上线服务后的schema进行巡检与检测的方式来进行讨论。


二、Variety


Variety是一个开源的,非常使用的,检测mongodb表字段类型、分布的一个开源工具。正如其github readme中第一句所说"**Meet Variety, a Schema Analyzer for MongoDB**"。


Variety能够帮助我们检测我们MongoDB表中的字段类型、分布,并生产报表,可以让我们非常直观的对现有表结构、字段类型进行分析,并找出数据模型中的隐患。


下面我们通过例子来进行讲解:


首先,建立一个表


\


我们来看看通过variety获得的结果


\


test是我们的db名,users是表名。我们可以看到,针对我们之前插入的5条数据,variety跑出的结果是:


所有的document都含有_id,和name字段,60%的document含有bio字段,40%的document含有birthday和pets字段,且pets字段有2个类型的数据(4个array的,1个string的),20%的document含有someBinData和SomeWeirdLegacyKey字段。


然而生产环境中由于我们的数据量较大,比如一个表有10亿条数据,全部进行扫描会耗时较长,可能我们仅希望对1000条数据进行分析,这时候就可以使用limit来限定。


\


由于MongoDB的可以通过内嵌来减少联合查询的需求,可以通过反范式来减少随机IO,所以很可能会有嵌套出现在我们的document中。有的时候嵌套的层数太多了,影响我们的统计信息,怎么办,我们可以通过maxDepth来限制。请参考下面的例子:


\

\



又或者我们希望指定统计的条件,比如希望caredAbout为true的,可以这样做:


```

$ mongo test --eval "var collection = 'users', query = {'caredAbout':true}" variety.js

```


又或者是希望进行排序:


```

$ mongo test --eval "var collection = 'users', sort = { updated_at : -1 }" variety.js

```


同时我们也可以指定分析结果的format:


```

$ mongo test --quiet --eval "var collection = 'users', outputFormat='json'" variety.js

```

一般在生产中, 我们不会在primary上进行分析, 我们可以在一个priority为0,且为hidden的secondary上进行分析,这时候需要指定slaveOK:


```

$ mongo secondary.replicaset.member:31337/somedb --eval "var collection = 'users', slaveOk = true" variety.js

```

又或者说我们希望将分析结果存在mongo中:


```

$ mongo test --quiet --eval "var collection = 'users', persistResults=true" variety.js

```


并且指定存储的详细信息:


- resultsDatabase 分析结果所存储的db名

- resultsCollection 分析结果所存储的collection名

- resultsUser 分析结果存储的实例的user

- resultsPass 分析结果所存储的实例的password


```

mongo test --quiet --eval "var collection = 'users', persistResults=true, resultsDatabase='db.example.com/variety' variety.js

```


三、我们为什么要用Variety呢?


尽管我们MongoDB是Schema Free的,但是绝大多数情况下, 我们都希望字段类型统一。


不一致的字段类型可能会为我们的数据带来误差,试想一下,如果某个字段的字段类型不统一,而我们却不知情,这时候很可能会发现业务查询有数据丢失,数据不准确。


并且在生产环境中,应用的版本在不断迭代,需求不断增多,字段也随之变化,如果在没有规范化的上线流程检查过后,数据库中可能还会存在部分数据的字段确实,比如有的document有a字段,有的却没有,variety也可以帮助我们发现这些问题。


四、Document Validation


MongoDB 3.2推出了很多给力的功能,在这不得不提及Document Validation,Document Validation的出现我想也是MongoDB官方想表达”schema free but you may need some rules”吧,哈哈,纯属臆测。


简单介绍下Document Validation:


我们可以为我们schema free的mongodb collection做一些限制。当然这并不是意味着MongoDB变成了关系型数据库,个人觉得这反而更好的突出了MongoDB Schema free的特性。在正确的地方、需要的地方schema free,在适当的地方要有限制。


假设我们要新建一个表contacts,要有如下约束:


phone字段为string类型或者email字段要匹配”@mongodb.com”结尾,或者status为”Unknown”或者"Incomplete"


\


对已经建立了的表,我们可以通过如下方式来做限定:


\


这里可以看到,多了一个validationLevel参数,我们可以在设置validation的时候指定我们的validationLevel级别:


- 默认级别是strict,对该collection已有的和以后新增的document都进行validation验证;



- 可以设置为moderate,仅对已经存在的document进行validation限定;


同时还有validationAction参数来指定当有不符合validation规则的数据进行update或者insert的时候, 我们mongodb实例如何进行处理。


- 默认级别为error,mongodb将拒绝这些不符合validation规则的insert和update。

- 可以设置为warn,mongodb会在日志中记录,但是允许这类insert和update操作。日志中如:

\


五、validation的限制


- validation不能对admin、local和config库中的collection进行设置;

- 不能对system.*这类collections进行validation设置;


作者介绍:周李洋

  • 【DBA+社群】联合发起人

  • 社区常用ID eshujiushiwo,Teambition运维总监

  • MongoDB Contribution Award获得者,大陆首位MongoDB Certified Professional

  • MongoDB上海用户组发起人

  • CSDN MongoDB版主。关注Mysql与MongoDB技术,数据架构,服务器架构,高效运维等。

  • mongo-mopre,mongo-mload作者

  • MongoDB官方翻译组核心成员,MongoDB中文站博主


本文来自云栖社区合作伙伴"DBAplus",原文发布时间:2016-01-15

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
7月前
|
存储 NoSQL MongoDB
【MongoDB】如何在MongoDB中设计Schema?
【4月更文挑战第2天】【MongoDB】如何在MongoDB中设计Schema?
|
4月前
|
JSON NoSQL MongoDB
MongoDB Schema设计实战指南:优化数据结构,提升查询性能与数据一致性
【8月更文挑战第24天】MongoDB是一款领先的NoSQL数据库,其灵活的文档模型突破了传统关系型数据库的限制。它允许自定义数据结构,适应多样化的数据需求。设计MongoDB的Schema时需考虑数据访问模式、一致性需求及性能因素。设计原则强调简洁性、查询优化与合理使用索引。例如,在构建博客系统时,可以通过精心设计文章和用户的集合结构来提高查询效率并确保数据一致性。正确设计能够充分发挥MongoDB的优势,实现高效的数据管理。
68 3
|
4月前
|
安全 C# 数据安全/隐私保护
WPF安全加固全攻略:从数据绑定到网络通信,多维度防范让你的应用固若金汤,抵御各类攻击
【8月更文挑战第31天】安全性是WPF应用程序开发中不可或缺的一部分。本文从技术角度探讨了WPF应用面临的多种安全威胁及防护措施。通过严格验证绑定数据、限制资源加载来源、实施基于角色的权限管理和使用加密技术保障网络通信安全,可有效提升应用安全性,增强用户信任。例如,使用HTML编码防止XSS攻击、检查资源签名确保其可信度、定义安全策略限制文件访问权限,以及采用HTTPS和加密算法保护数据传输。这些措施有助于全面保障WPF应用的安全性。
53 0
|
7月前
|
存储 NoSQL MongoDB
阿里云 Flink 原理分析与应用:深入探索 MongoDB Schema Inference
本文整理自阿里云 Flink 团队归源老师关于阿里云 Flink 原理分析与应用:深入探索 MongoDB Schema Inference 的研究。
47188 2
阿里云 Flink 原理分析与应用:深入探索 MongoDB Schema Inference
|
存储 NoSQL 关系型数据库
利用聚合概念指导MongoDB的Schema设计
利用聚合概念指导MongoDB的Schema设计
利用聚合概念指导MongoDB的Schema设计
|
存储 NoSQL 算法
2023最新MongoDB规范
2023最新MongoDB规范
851 0
|
存储 NoSQL 分布式数据库
|
2月前
|
存储 关系型数据库 MySQL
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
|
29天前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。
|
2月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第20天】本文探讨了MongoDB Atlas的核心特性、实践应用及对未来云原生数据库的思考。MongoDB Atlas作为云原生数据库服务,具备全球分布、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了实施MongoDB Atlas的最佳实践和职业心得,展望了云原生数据库的发展趋势。
下一篇
无影云桌面