面向文档的数据库是不是比关系数据库更适合持久化对象?

Posted

技术标签:

【中文标题】面向文档的数据库是不是比关系数据库更适合持久化对象?【英文标题】:Are document-oriented databases any more suitable than relational ones for persisting objects?面向文档的数据库是否比关系数据库更适合持久化对象? 【发布时间】:2010-02-25 17:34:25 【问题描述】:

在数据库使用方面,过去十年是 ORM 时代,数百人竞相将我们的对象图保存在普通的老式 RMDBS 中。现在我们似乎正在见证面向文档的数据库时代的到来。 These databases 针对无模式文档进行了高度优化,但它们的横向扩展和并行查询集群的能力也非常有吸引力。

与 RDBMS 相比,面向文档的数据库在面向对象设计中持久化数据模型方面也具有一些优势。由于表是无模式的,因此可以将属于不同类的对象并排存储在继承层次结构中。此外,随着域模型的变化,只要代码能够处理从旧版本的域类中取回对象,就可以避免每次更改时都必须迁移整个数据库。

另一方面,面向文档的数据库的性能优势主要出现在存储更深的文档时。在面向对象的术语中,由其他类组成的类,例如,博客文章及其 cmets。不过,在我能想到的大多数示例中,例如博客示例,读取访问的增益似乎被每次有新评论时必须编写整个博客文章“文档”的惩罚所抵消已添加。

在我看来,如果一个人非常小心地将对象组织成针对数据读取和写入方式进行优化的深度图中的对象,那么面向文档的数据库可以为面向对象的系统带来显着的好处,但这意味着了解前面的用例。在现实世界中,我们通常只有在真正拥有可以分析的实时实现时才知道。

那么,关系数据库与面向文档的数据库的情况是不是一种摇摆和迂回?我对人们的意见和建议很感兴趣,尤其是如果有人在面向文档的数据库上构建了任何重要的应用程序。

【问题讨论】:

【参考方案1】:

这取决于您的数据的结构以及数据访问模式。

文档数据库存储和检索文档,基本的原子存储单元是文档。正如您所说,您需要考虑您的数据访问模式/用例来创建智能文档模型。当您的域模型可以在某些文档中拆分和分区时,文档数据库就像一个魅力。例如,对于博客软件、CMS 或 wiki 软件,document-db 工作得非常好。只要您能找到一种将数据压缩到文档中的好方法,您就没有任何问题。但不要尝试to fit a relational-model into a document-database。 一旦您的数据访问模式在关系上使用大量“导航”,图形或对象数据库就是更自然的选择。

另一件事是关于读/写性能的权衡。例如博客软件。在过渡性 RDBMS 数据模型中,数据是标准化的。这意味着,读取数据是昂贵的,因为从不同的表中读取,计算与连接的关系等来读取博客文章。作为交换,更换标签并不昂贵。 相比之下,在文档数据库中阅读博客文章很便宜,因为您只需加载文章文档。但是更新可能更昂贵,因为您需要存储整个文档。或者更糟糕的是,通过大量文档来更改某些内容(重命名标签场景)。在大多数系统中,阅读比写作更重要。因此,使用重新规范化的数据存储实际上是有意义的。

我认为在大型数据库上,无模式设计可以有其优势。在 RDBMS 中,您需要升级架构,这是一个非常痛苦的过程。尤其是将现有数据转换为新模式。在无模式数据库中,您的应用程序需要处理它,这提供了更大的灵活性。例如,您可以在访问旧文档时即时升级架构。这样一来,您就可以让庞大的数据库保持正常运行,同时让应用程序动态处理旧版本。

【讨论】:

感谢您。我正在参加一个 MongoDB 演讲,演讲者对关系型和基于文档的比较主题并没有很清楚。这个答案,特别是标签更新示例,非常有帮助。

以上是关于面向文档的数据库是不是比关系数据库更适合持久化对象?的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb和mysql的区别

为啥我应该使用基于文档的数据库而不是关系数据库?

Hibernate入门

以实例说明啥是“对象—关系映射”?

推荐一款关于MongoDB日志分析的工具--Mtools

omr框架