命名规范
文档
设计约束
- UTF-8 字符
- 不能包含 \0 字符(空字符),这个字符标识建的结尾
- . 和 $ 有特殊含义,需要避免
- 区分大小写
- 键不能重复
- 键/值对有序
实践约束
- 【强制】文档中的key禁止使用_以外的特殊字符
- 【强制】key全部小写,多个单词可以下划线分割
- 【强制】禁止使用数字打头的key
- 【强制】禁止自定义_id(_id一般自增,使用无序id极有可能降低写入性能)
- 【建议】相似类型文档放在一个集合中,能大幅提高索引利用率
- 【建议】若业务上对于存放数据大小写不敏感,则使用全部大写/小写存放(或者增加一个统一了大小写写的辅助字段)。使用忽略大小写的查询极其耗费性能
- 【建议】不要存放太长的字符串
TIPS
MongoDB索引仅支持1KB以内的字段
集合
设计约束
- UTF-8 字符
- 不能是空字符串("")
- 不能包含 \0 字符(空字符),这个字符标识集合名的结束
- 不能以 “system.” 开头,这是为系统保留的前缀
- 不在集合中包含字符 “$”
- 使用 “.” 来分隔不同命名空间的子集合,如一个博客可能包含两个子集合,blog.posts和blog.authors,而blog本身可以不存在
实践约束
- 【强制】禁止使用_以外的特殊字符
- 【强制】集合名称不超过64字符
- 【强制】集合名称全部小写
- 【强制】禁止使用数字打头的集合名,禁止使用system打头的集合名(system为系统集合前缀)
- 【建议】为了避免库级锁带来的问题,应尽量对写入较大的集合使用“单库单集合”的结构,所以对于新增业务应尽量创建新库,而不是在现有库中创建新集合
数据库
设计约束
- UTF-8 字符
- 不能是空字符串("")
- 基本上只能使用 ASCII 中的字母和数字。不能含有 /、\、.、"、*、<、>、:、|、?、$、(空格)、\0(空字符)
- 全部使用小写。(支持大写,不建议使用)
- 不超过64字节
- 存在保留数据库如:admin、local、config
TIPS
数据库名称限制主要是由于数据库最终会变成文件系统里的文件,而数据库名就是相应的文件名,因此才有很多约束
实践约束
- 【强制】数据库名称全部小写
- 【强制】数据库名称不超过64字符
- 【强制】禁止使用_以外的特殊字符
- 【强制】禁止使用数字打头的数据库名
- 【强制】禁止与保留的数据库重名,如:admin,local,config等
索引
- 【强制】索引名称长度不超过128字节
- 【强制】禁止在数组字段上创建索引
- 【强制】创建组合索引时,尽量将数据基数大(唯一值多的数据)的字段放在组合索引前面
查询
- 【建议】先做等值查询,再做排序,再做范围查询
- 【建议】查询中的某些 $ 操作符可能会导致性能低下,尽量避免
TIPS
n e , ne, ne,not, e x i s t s , exists, exists,nin,$or,尽量在业务中不要使用
$exist:因为松散的文档结构导致查询必须遍历每一个文档
$ne:如果当取反的值为大多数,则会扫描整个索引
$not:可能会导致查询优化器不知道应当使用哪个索引,所以会经常退化为全表扫描
$nin:全表扫描
$or:有多少个条件就会查询多少次,最后合并结果集,所以尽可能的使用 $in
命名空间
- 将数据库名添加到集合前,得到集合的完全限定名,称为命名空间(namespace),如cms数据库的blog.posts集合,命名空间即为:cms.blog.posts。实际使用中命名空间长度不得超过100字节
参考资料
- MongoDB权威指南