当前位置: 首页 > news >正文

大厂MongoDB开发运维规范

一、 设计规范

1.1 数据库设计规范

1.【强制】数据库名最多为32个字符,库名全部小写,禁止使用 _ 以外的任何特殊字符,如空格和\ /.”∗<>∣?中任一字符。说明:数据库名称在MongoDB中不区分大小写,库以文件夹的形式存在,使用特殊字符或其它不规范的命名方式会导致命名混乱。2.【建议】库名要见名思意,单词和拼音不要混用,建议不用拼音,单词之间使用下划线分割。3.【强制】禁止使用数字打头的库名。正例:usercar反例:wechatactivity、123wechat、*<>| ?中任一字符。说明:数据库名称在 MongoDB 中不区分大小写,库以文件夹的形式存在,使用特殊字符或其它不规范的命名方式会导致命名混乱。 2.【建议】库名要见名思意,单词和拼音不要混用,建议不用拼音,单词之间使用下划线分割。 3.【强制】禁止使用数字打头的库名。 正例:user_car 反例: wechat_activity、123wechat、<>?中任一字符。说明:数据库名称在MongoDB中不区分大小写,库以文件夹的形式存在,使用特殊字符或其它不规范的命名方式会导致命名混乱。2.【建议】库名要见名思意,单词和拼音不要混用,建议不用拼音,单词之间使用下划线分割。3.【强制】禁止使用数字打头的库名。正例:usercar反例:wechatactivity123wechatwechat、usercar
4.【强制】不要与系统保留的数据库名相同,这些数据库包括:admin,local,config 等。
5.【强制】库命名规则为系统名称,如 user_order(用户订单),不建议使用无意义的库名称,如 abc。

1.2 集合设计规范

1.【强制】 集合名称最多为32个字符,集合名称全部小写,禁止使用_以外的任何特殊字符,如空格和/.”∗<>∣?中任一字符说明:mongoshell遇到−、*<>| ? 中任一字符 说明:mongo shell 遇到-、<>?中任一字符说明:mongoshell遇到、\等特殊字符需要转义,否则无法使用,除非使用 getCollection 函数,但是无法使用 mongo shell 的自动补全功能,不便于操作。
2.【强制】禁止使用数字打头的集合名,如:123_abc。
3.【强制】禁止 system 打头,system 是系统集合前缀。
4.【建议】集合名要见名思意,单词和拼音不要混用,建议不用拼音,单词之间使用下划线分割。
5.【建议】为了避免库级锁带来的问题,不同业务使用不同的库,对于新增业务应尽量创建新库,而不是在现有库中创建新集合。

1.3文档设计规范

1.【建议】设计文档时,建议加上两个时间字段:sys_ctime 和 sys_utime。
2.【强制】文档中的 key 禁止使用_以外的任何特殊字符。
反例:$username_abb
3.【强制】key 全部小写,多个单词以下划线分隔。
反例: usernameAbb
4.【强制】禁止使用数字打头的 key。
反例: 1_username_abb

1.4 索引设计规范

1.【强制】禁止开发在代码层加入创建索引的操作逻辑。
说明:如java里的索引注解。代码中创建索引为前台创建,当DBA维护清理冗余索引时,代码会重新在前台创建索引,从而引起数据库阻塞。
2.【强制】索引名称长度不要超过 64 字符。
3.【建议】创建索引时要显示指定索引名,普通索引为idx_fieldname1_fieldname2,唯一索引uniq_fieldname1_fieldname2,字段太长的联合索引考虑缩写。
4.【强制】禁止在数组字段上创建索引,如禁止在字段 {select:[X,Y,Z]} 上添加索引 {select:1}。
说明:如果数组元素很多会导致索引很大,因为 MongoDB 会主动为这个数组中的所有元素依次添加独立索引,复合索引不能覆盖数组字段上的查询。

二、连接规范

  1. 【建议】合理控制连接池的大小,限制连接数资源,可通过 Connection String URL 中的 maxPoolSize 参数来配置连接池大小,建议根据腾讯云 MongoDB 的配置进行设定。
    在这里插入图片描述

三、CURD 规范

3.1 更新规范

1.【强制】更新文档一定要带上有索引的字段作为条件。
2.【强制】尽量避免对数组进行更新操作,如果一定要更新,尽量在尾部插入元素,禁止在头部插入。
说明:当向数组的头部添加元素时,oplog 里的set操作不再是设置数组某个位置的值(因为基本所有的元素位置都调整了),而是set 操作不再是设置数组某个位置的值(因为基本所有的元素位置都调整了),而是set操作不再是设置数组某个位置的值(因为基本所有的元素位置都调整了),而是set 数组最终的结果,即整个数组的内容都要写入 oplog,会导致主从复制延时增大
3.【建议】对于文档替换和目标字段更新,优先使用目标字段更新,使用目标更新可以在序列化和传输数据上花费更少的时间,获得更好的性能。

3.2写入规范

1.【建议】对于集合的批量写入(bulkwrite)操作,可以提前估算一下插入文档大小,根据文档大小控制好 批次,比如一次插入 50 条大小为 512B 的文档。
说明:在单个批处理操作中,3.6 之前版本限制为 1000 条,3.6 版本之后限制为 100000 条,控制好批次是为了减少对 MongoDB 的影响,大批量写入时,不仅会导致主从复制延迟增大,还会导致 MongoDB 频繁刷新太多脏页,使 MongoDB 使用更多的系统资源,如果用了写关注,性能还会有所下降,对于 4.0 版 本以上 MongoDB 支持多文档事务,在一个事务里面所有语句大小必须小于 16M(oplog 文档大小限制),否则事务会被丢弃并且回滚。

3.3删除规范

1.【强制】删除文档一定要带上有索引的字段作为条件。
2.【建议】大批量删除数据时,先估算一下单个文档大小,根据文档大小控制好批次,比如一次删除 50 条大小为 512B 的文档。
说明:控制好批次是为了减少对 MongoDB 的影响,大批量删除时,不仅会导致主从复制延迟增大,还会导致 MongoDB 频繁刷新太多脏页,使 MongoDB 使用更多的系统资源,如果用了写关注,性能还会有所下降。 (文档大小计算方法查看前文)
3.【建议】删除操作不会删除索引,即使从集合中删除所有文档也是如此,所以如果要清空一个集合,建议删除在创建。

3.4查询规范

1.【强制】单条查询语句大小不能超过 10k。
说明:超过 10k 大小的语句记录在 MongoDB 慢查询中被截断,慢查询显示警告 warning: log line attempted (284kB) over max size (10kB)。
2.【建议】不推荐使用 view,推荐使用 mapreduce,view 相比较聚合有比较多的限制。

四、运维规范

4.1 部署规范

1.【强制】在创建新库或者大批量写数据时,开发需要告知 DBA 数据量大小、OPS 等,由 DBA 和开发一起评估,在决定是否需要扩容或者新建集群。
2.【推荐】业务划分原则一般遵循:
在线应用使用独立集群
离线应用可以根据实际情况决定是否混合部署
相近业务尽量在相同实例复用
3.【推荐】MongoDB 优先使用 WiredTiger 存储引擎,根据业务需要决定是否使用 mongorocks 存储引擎。
4.【推荐】在满足业务的情况下,优先使用副本集,根据业务量大小决定是否使用分片集群(分片>=2)。
5.【强制】使用分片集群(分片>=2)的业务,所有集合都要进行分片,防止出现集群倾斜。

4.2 操作规范

1.【强制】线上禁止将非固定集合转换为固定集合,因为在操作期间会出现数据库独占锁,同一数据库的其他操作将被阻止,直到操作完成。
2.【强制】创建索引必须由 DBA 操作,对于千万级别以上集合,要在业务低峰期执行。
3.【建议】删除库时,先使用 db.collection.drop() 把里面的集合一个个删除,最后在删除库。
4.【强制】禁止在线上使用可能会锁住数据库的操作,使用前需要反复确认线上是否可以执行。

4.3 数据库限制

1.【建议】MongoDB 社区版本不支持中文全文索引,只有企业版支持,目前腾讯云也不支持,如果集合很小并且字段内容不多,可以使用$regexp,数据量比较大建议使用 ES。
2.【建议】MongoDB 3.6 副本集或者分片集群支持可重试写入,但只支持一次重试,单实例不支持。Mongo 3.2不支持可重试写入

4.4 注意事项

1.【强制】操作线上时,要确认命令是否正确,不建议手敲命令,模糊的命令建议 help()查看一下。
正例:
db.carproposalrisk.createIndex({riskCode:1,expiredTime:1},{name:“idx_risk_ex pire”, background:true})
反例: db.carproposalrisk.createIndex({riskCode:1,expiredTime:1},{name:“idx_risk_ex pire”},{background:true})
说明:最后一条语句在 mongo shell 不会出现语法错误,但是会导致建索引在前台执行了,会阻塞这个集合所在的库,也就是说{background:true}被截断了。
2.【强制】查看线上语句执行计划时,要把 explain()函数放在集合名后面。
正例: db.info.explain(‘executionStats’).update({‘title’: ‘mongodb教程’},{KaTeX parse error: Expected 'EOF', got '}' at position 28: …:'wechat_test'}}̲) 反例: db.info.…set:{‘title’:‘wechat_test’}}).explain //这个语法会直接更新数据,mongo shell认为这个语法合法,.explain 被截断
说明:如果操作是查询操作,那么 explain()函数可以放到集合名后面,也可以放在语句的最后面,为了减少人为错误,强制使用 explain()在集合名后面使用。

完整内容文档下载链接

内容太多,完整内容文档下载:
《腾讯数据库规范2025.zip》(包括(MySQL、Mongo规范以及数据库选型规范)

http://www.dtcms.com/a/466240.html

相关文章:

  • 公司网站可以自己做吗wex5可以做网站吗
  • 在浏览器上播放摄像头rtsp视频流的实现方案
  • LeetCode算法日记 - Day 67: 不同路径、最长递增子序列
  • 2024ICPC区域赛香港站
  • 公司网站备案怎么做运营管理培训
  • 基于STM32的智能衣柜系统/智能衣帽间/wifi衣柜/wifi衣帽间/智能家居系统
  • access 网站后台seo引擎
  • 打字训练文章大全:哪吒打字1000篇打字文章素材
  • 使用 minimind
  • MinerU与Docling:智能文档处理框架对比
  • GAN(Generative Adversarial Nets)生成对抗网络论文笔记
  • sql练习
  • GESP C++等级认证三级12-操作string2-1
  • 人像摄影网站十大排名给公司建网站
  • 哈尔滨模板建站公司推荐上海传媒公司ceo是谁
  • Kubeadm安装完Kubernetes(K8S)后,ssh连不上了
  • 东方博宜OJ 1007:统计大写英文字母的个数 ← string
  • 3D地球可视化教程 - 第3篇:地球动画与相机控制
  • Python实现跳动的爱心
  • 网络营销策略存在的问题seo搜索引擎优化是做什么的
  • 中国建设银行门户网站wordpress 功能
  • 【ProtoBuffer】简介与安装
  • 网站管理 设置开启电子商务和网络购物网站
  • vue2和vue3响应式原理有何不同?
  • 做化工的 有那些网站沈阳网站排名工具
  • 郑州做网站的大公网站建设冫首先金手指十五
  • mysql数据库压缩
  • Ubuntu 下编译 mbedtls 并使用
  • 外贸公司用什么建网站新东方雅思培训机构官网
  • prompt构建技巧