欢迎来到科站长!

MongoDB

当前位置: 主页 > 数据库 > MongoDB

MongoDB开发规范与数据建模详解

时间:2024-09-22 14:56:19|栏目:MongoDB|点击:

MongoDB开发规范

1.命名原则

  • 数据库名使用小写字符,集合名称使用统一命名风格。可以统一大小写或者驼峰命名。数据库名和集合名均不能超过64个字符

2.集合设计

  • 对于少量数据的包含关系使用嵌套模式有利于读写性能和保证原子性的写入。对于复杂的关系,以及后期可能发生演进变化的情况,建议使用引用模式

3.文档设计

  • 避免使用大文档,MongoDB的文档最大不能超过64MB。
  • 如果使用了内嵌子文档或数组,应该保证内嵌数据不能无限增长。在文档结构上,尽可能减少字段名的长度,MongoDB会保存文档中的字段名,因此整个字段名的长度会影响整个集合的大小和内存的需求。一般建议将字段名控制住32字符以内

4.索引设计

  • 在必要时使用索引加速查询。避免建立过多的索引,单个集合不建议超过10个索引。mongodb对数据的写入很可能会触发索引的写入,从而触发更多的I/O操作。无效的索引会操作内存空间的浪费,需及时清理不需要的索引
  • 遵循索引优化原则,如覆盖索引、优先前缀匹配等,使用explain()命令分析索引性能

5.分片设计

  • 对可能出现快速增长或读写压力较大的业务表考虑分片。分片建的设计满足均衡分布的目标,业务上尽量避免广播查询。应尽早决定分片策略,建议在集合达到256GB之前进行分片,如果集合中存在唯一索引,则应该确保该索引覆盖分片建,避免冲突。为了降低风险,单个分片集数据量不建议超过2TB

6.升级设计

  • 应用上需支持对旧版本数据的兼容性,在添加唯一性索引约束之前,对数据表进行检查并及时清理冗余的数据。新增/修改数据库对象需经过评审,并保持对数据字典进行更新

7.考虑数据老化问题

  • 要及时清理无效、过期的数据。优先考虑为系统日志、历史数据表添加合理的数据老化策略

8.数据一致性方面

  • 非关键业务使用writeConcern: 1 。 对于关键业务类使用writeConcern: majority 。如果业务上严格不允许脏读,则使用ReadConcern:majority

9.使用update、findAndUpdate对数据进行更新时,如果使用过了upset: true,则必须使用唯一性索引避免产生重复数据

10.业务上尽量避免短连接,使用官方最新驱动的连接池实现,控制客户端连接的数量,最大不建议超过200

11.对大量数据写入使用Bulk Write批量化API,建议使用无序批次更新

12.优先使用单文档事务保证原子性,如果需要使用多文档事务,则必须保证事务尽可能小,一个事务的执行时间最长不超过60s

13.在条件允许的情况下,使用读写分离降低primary节点的压力。对于一些统计分析类的查询可优先从节点上读取

14.考虑业务数据的隔离,例如将配置项数据、历史数据存放在不同的数据库中,微服务之间使用单独的数据库,尽量避免垮库访问

15.维护数据字典文档,并保持更新,提前按不同的业务进行数据容量规划

MongoDB数据建模

嵌入式文档 一对一关系模型

嵌入式文档模型

以下映射客户和地址关系的示例。对于这种数据量较小的文档使用嵌入式文档更好

1
2
3
4
5
6
7
8
9
10
11
12
13
// patron document
{
   _id: "joe",
   name: "Joe Bookreader"
}
// address document
{
   patron_id: "joe", // reference to patron document
   street: "123 Fake Street",
   city: "Faketon",
   state: "MA",
   zip: "12345"
}

如果经常将address数据与name信息一起检索,更好的Realm 数据模型是将address数据嵌入到patron数据中,如以下文档所示:

1
2
3
4
5
6
7
8
9
10
{
   _id: "joe",
   name: "Joe Bookreader",
   address: {
              street: "123 Fake Street",
              city: "Faketon",
              state: "MA",
              zip: "12345"
            }
}

子集模式

嵌入式文档模型的一个潜在问题是,它可能会导致大型文档包含应用程序不需要的字段。 这些不必要的数据可能会给服务器造成额外负载,并减慢读取操作的速度。相反,可以使用子集模式来检索在单个数据库调用中访问最频繁的数据子集。

考虑一个显示电影信息的应用程序。 movie数据库包含具有以下模式的collection集合:

{
  "_id": 1,
  "title": "The Arrival of a Train",
  "year": 1896,
  "runtime": 1,
  "released": ISODate("01-25-1896"),
  "poster": "http://ia.media-imdb.com/images/M/MV5BMjEyNDk5MDYzOV5BMl5BanBnXkFtZTgwNjIxMTEwMzE@._V1_SX300.jpg",
  "plot": "A group of people are standing in a straight line along the platform of a railway station, waiting for a train, which is seen coming at some distance. When the train stops at the platform, ...",
  "fullplot": "A group of people are standing in a straight line along the platform of a railway station, waiting for a train, which is seen coming at some distance. When the train stops at the platform, the line dissolves. The doors of the railway-cars open, and people on the platform help passengers to get off.",
  "lastupdated": ISODate("2015-08-15T10:06:53"),
  "type": "movie",
  "directors": [ "Auguste Lumière", "Louis Lumière" ],
  "imdb": {
    "rating": 7.3,
    "votes": 5043,
    "id": 12
  },
  "countries": [ "France" ],
  "genres": [ "Documentary", "Short" ],
  "tomatoes": {
    "viewer": {
      "rating": 3.7,
      "numReviews": 59
    },
    "lastUpdated": ISODate("2020-01-09T00:02:53")
  }
}


上一篇:MySQL分支选择参考:Percona还是MariaDB

栏    目:MongoDB

下一篇:Mongodb通配符索引签名和使用限制问题记录

本文标题:MongoDB开发规范与数据建模详解

本文地址:https://fushidao.cc/shujuku/770.html

广告投放 | 联系我们 | 版权申明

申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:1205677645 | 邮箱:1205677645@qq.com

Copyright © 2018-2024 科站长 版权所有冀ICP备14023439号