MongoDB设计方法及技巧

MongoDB是一种流行的数据库,能够在不受任何表格schema模式的约束下工做。数据以相似JSON的格式存储,而且能够包含不一样类型的数据结构。例如,在同一集合collection 中,咱们能够拥有如下两个文档document:vue

{
    id: '4',
    name: 'Mark',
    age: '21',
    addresses : [
        { street: '123 Church St', city: 'Miami', cc: 'USA' },
        { street: '123 Mary Av', city: 'Los Angeles', cc: 'USA' }
    ]
}

{
    id: '15',
    name: 'Robin',
    department: 'New Business',
    example: 'robin@example.com'
}

为了可以充分利用MongoDB的优点,您必须了解并遵循一些基本的数据库设计原则。在讲解设计方法以前,咱们必须首先了解MongoDB存储数据的结构。spring

1、 数据如何存储在MongoDB中

与传统的RDBMS关系型数据库不一样,MongoDB并无表Table,行row和列column的概念。它将数据存储在集合collections,文档documents和字段fields中。下图说明了与RDBMS类比的结构之间的关系:数据库

RDBMS vs MongoDB

2、数据库设计技巧和窍门

2.1.规范化存储与非规范化存储

由于MongoDB使用文档来存储数据,因此理解“规范化存储“”和“非规范化存储”的概念很是重要。后端

规范化存储:-规范化意味着将数据存储到多个集合collections中,并在它们之间设计关联关系。数据保存以后,更新数据比较容易。可是在读取数据的时候,规范化存储的缺点就显现出来。若是要从多个集合collections查找数据,则必须执行多个查询,从而使读取数据的速度变慢。 (好比:将网页标题、做者、内容分别存储到不一样的collections中)设计模式

非规范化存储:-这种方式将若干对象数据,以嵌套的方式存储到单个文档中。它在读取数据的时候表现更好,但在写入时会变慢。这种存储数据的方式还将占用更多空间。 (好比:将网页标题、做者、内容分别存储到同一个collection中)数组

因此在两种存储数据方式之间进行选择以前,先评估一下你的应用数据库的使用方式。springboot

  • 若是您有一个不须要频繁更新的数据,更新的即时一致性不是很重要,可是在读取时须要良好的性能,那么非规范化多是明智的选择。(好比:咱们博客的博文,做者一旦保存以后,几乎就不在进行频繁的修改,可是面临着读者频繁的读取阅读操做)
  • 若是数据库中的文档数据须要不断的更新,而且您但愿在写入时具备良好的性能,那么您可能须要考虑规范化存储。(好比:须要频繁修改数据的业务类系统)

2.2. 一对多关系

与RDBMS相比,在MongoDB中对“一对多”关系建模须要进行更细粒度的设计。许多初学者陷入将文档数组嵌入父文档中的陷阱。正如咱们在上文中介绍的,知道什么时候进行规范化存储或非规范化存储是很是重要的。所以设计者须要考虑关系的基数是“一个对少数几个”仍是“一个对多个”?每种关系将具备不一样的建模方法。 数据结构

例如:下面“一个对少数几个”的建模示例。最好的建模方法是在父文档(persopn)中嵌入几个(address):架构

> db.person.findOne()
{
  name: 'Mark Kornfield',
  ssn: '1223-234-75554',
  addresses : [
     { street: '123 Church St', city: 'Miami', cc: 'USA' },
     { street: '123 Mary Av', city: 'Los Angeles', cc: 'USA' }
  ]
}

在“一个对多个”示例中,咱们将考虑设计两个集合,即产品products集合和零件parts集合。每一个零件都有一个“ ObjectID”,该“ ObjectID”将出如今产品集合的引用中。这样的设计可让读写性能更高效。less

> db.parts.findOne()
{
    _id : ObjectID('AAAA'),
    partno : '1224-dsdf-2215',
    name : 'bearing',
    price: 2.63

> db.products.findOne()
{
    name : 'car',
    manufacturer : 'Ford',
    catalog_number: 2234,
    parts : [     // array of references to Part documents
        ObjectID('AAAA'),    // reference to the bearing above
        ObjectID('F17C'),    // reference to a different Part
        ObjectID('D2AA'),
        // etc
]

2.3.设计模式可视化

尽管MongoDB是schemaless“无模式的”,但仍然存在将集合collections可视化为图表的方法。可以查看设计图,将对您理解和设计MongoDB的方式上产生重大影响。 

DbSchema是能够很好地完成可视化设计工做的一个工具。以下图所示,它将经过读取集合和文档来推导架构。此外,您只需单击就能够修改图中的对象。在DbSchema中,您还能够为MongoDB建立外键,固然仅在本地建立,只用于设计目的。

Adding schema to MongoDB

2.4.智能索引

为了保持数据库的良好性能,有必要创建智能索引,这将简化写入和读取操做。知道MongoDB的索引优点和局限性很是重要,MongoDB保留用于排序操做的内存限制为32MB。若是你不使用索引,则排序时数据库将被迫将全部排序文档hold在内存里面,若是达到32M的限制,则数据库将返回错误或空集。 

结论

对MongoDB的透彻理解与对数据库想要实现的目标的清晰了解是良好数据库设计的秘诀。

欢迎关注个人博客,里面有不少精品合集

  • 本文转载注明出处(必须带链接,不能只转文字):字母哥博客

以为对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创做动力! 。另外,笔者最近一段时间输出了以下的精品内容,期待您的关注。

相关文章
相关标签/搜索