mongodb使用规范
本规范旨在帮助开发人员逐步建立合理使用数据库的意识,对数据库相关的资源申请、业务规范使用等提供规范性的指导,从而为公司业务系统稳定、健康地运行提供保障。
以下所有规范会按照【强制】、【建议】两个级别进行标注,对于【强制】级别的设计需强制修改调整。
[TOC]
基础规范
- 【强制】新实例强制端口 3717
- 【强制】新实例强制版本 Mongodb 6.0
- 【强制】新实例强制存储引擎 WiredTiger
- 【强制】管理员账号 rwuser,密码长度16位,包含数字、大小写、特殊符号;
- 【建议】每个mongodb实例单独配置一个安全组
- 【强制】禁止开通公网地址,禁止部署在公网可访问的服务器上
- 【建议】短期测试使用可以选择按量付费模式
- 【建议】根据实际的业务需要,从如下3种规格选择:
版本 | 适用场景 | 备注 |
---|---|---|
单节点 | 数据量一般、QPS不高、开发测试、单节点 | 备份过程会缩表、数据不可写 |
副本集 | 数据量一般、QPS不高 | 3节点(提供Primary、Secondary节点,还有1个隐藏节点) |
分片集群 | 数据量大、QPS高 | 提供mongos、shard、config三类节点, 可自主选择mongos节点和shard节点组建不同的实例 |
命名规范
所有对象命名应该遵循下述原则:
- 【强制】凡是需要命名的对象,其标识符不能超过30个字符;
- 【强制】名称必须以英文字母开头,不得以 _(下划线) 作为起始和终止字母;
- 【强制】所有名称的字符范围为:a-z, 0-9 和_(下划线),禁用大写、特殊符号、保留字、汉字和空格;
- 【强制】采用英文单词或英文缩写作为名称,不使用无意义的字符或汉语拼音;
- 【强制】名称应该清晰明了,能够准确表达事物的含义,最好可读,遵循“见名知意”的原则;
数据库命名规范
- 【强制】数据库名称统一使用小写,采用下划线_分割,禁止以中划线-或小数点.分割,比如
platform-2.3; - 【强制】数据库以 xxx_ 开头,再加业务系统代号,再加上具体业务名称,比如支付网关:xxx_pay_gateway;
注:xxx 可以是公司的英文标识,请根据实际修改。
Collection命名规范
- 【建议】以表的具体内容进行描述。如:用户基础信息的表名为 users
- 【建议】表中必须包含2个固定列:insert_time, update_time,且为datetime类型,示例如下:
{
_id: ObjectId("676be1b863cd2dde110eaca8"),
name: 'sam',
idnum: 4864494,
insert_time: ISODate("2018-05-07T07:46:36.169Z"),
update_time: ISODate("2018-05-07T07:46:36.169Z"),
is_deleted: 1
}
使用规范
- 【强制】禁止在应用服务器上通过命令直连生产Mongodb服务
- 【强制】创建索引要在后台创建,避免锁表,范例如下:
db.t1.createIndex({idcard:1},{background:1})
- 【强制】业务账号默认分配 readwrite 角色,范例如下:
use xxx_antifraud;
db.createUser({user:"user_antifraud",pwd:"Aa_123456",roles:[{"role":"readWrite","db":"xxx_antifraud"}],passwordDigestor:"server"});
- 【强制】禁止跨库查询,尽量不做跨表查询
- 【强制】禁止使用 text索引、hash索引、sparse索引(请用partial索引替代sparse索引)
- 【强制】Document越小越好,大小不超过16MB,否则会影响insert/update/query性能
- 【强制】子文档嵌套数不超过100层
- 【建议】单个collection的索引数量不得超过10个,否则增加维护负担、降低写入性能、占用更多空间
- 【建议】组合索引中fields数量最多为10个
- 【建议】时效性数据推荐使用TTL索引(Time to Live),对一个date类型的单列配置过期属性(时间戳或clock则不行)可实现对文档的自动过期删除,范例如下:
db.events.createIndex({"insert_time": 1},{expireAfterSeconds: 60*60*24*7})
- 【建议】创建索引若要指定index名字的时候,命名规范为:
. .$ ,长度不超过 90 个字符