文档导向数据库是否比关系型数据库更适合持久化对象?

3
在数据库使用方面,过去的十年是ORM的时代,数百个ORM竞相使用传统的关系型数据库管理系统来持久化我们的对象图。现在,我们似乎正在见证面向文档的数据库的成熟。这些数据库高度优化了无模式文档,但也非常有吸引力,因为它们能够扩展并查询并行集群。
对于面向对象设计中数据模型的持久化,文档导向数据库还具有一些优势。由于表是无模式的,可以将属于不同类别的对象存储在继承层次结构中。此外,随着领域模型的变化,只要代码能够处理从旧版本的领域类中获取对象,就可以避免每次更改都要迁移整个数据库的情况。
另一方面,文档导向数据库的性能优势似乎主要体现在存储更深层次的文档时。用面向对象的术语来说,这些类由其他类组成,例如博客文章及其评论。然而,在我能想到的大多数示例中,例如博客,读取访问的增益似乎被每次添加新评论时必须写整个博客文章“文档”的惩罚所抵消。
在我的看法中,如果极度注意以针对数据的读写方式进行优化的深图形式组织对象,则文档导向数据库可以为面向对象系统带来显著的好处,但这意味着需要事先了解用例。在实际情况下,我们通常直到有实际的实现可供分析才知道。
那么关系型与文档导向数据库的情况是否是一个摇摆不定的问题呢?我对人们的观点和建议感兴趣,特别是如果有人在文档导向数据库上构建了任何重要应用程序。
1个回答

5
要看你的数据结构和数据访问模式如何。文档数据库存储和检索文档,基本的原子存储单元是一个文档。正如你所说,你需要考虑数据访问模式/用例来创建一个智能文档模型。当你的域模型可以在一些文档中分割和分区时,文档数据库就像魔力一样运作。例如,对于博客软件、CMS或wiki软件,文档数据库非常适用。只要你能找到一个好的方法将数据压缩到一个文档中,你就不会有任何问题。但是不要试图将关系模型适配到文档数据库。只要你的数据访问模式在关系上使用了大量的'导航',图形或对象数据库就是更自然的选择。
另一个问题涉及读写性能的取舍。例如博客软件。在传统的关系型数据模型中,数据被归一化。这意味着读取数据很昂贵,因为需要从不同的表中读取数据,使用联接计算关系等来读取博客文章。作为交换,更改标签是廉价的。
相比之下,在文档数据库中,读取博客文章很容易,因为您只需加载文章文档即可。然而,更新可能更加昂贵,因为您需要存储整个文档。或者更糟糕的是,要浏览大量文档才能更改某些内容(重命名标记场景)。在大多数系统中,阅读比撰写更重要。因此,实际上使用重新规范化的数据存储是有意义的。
我认为,在大型数据库上,无模式设计具有其优点。在关系型数据库中,您需要升级模式,这是一个非常痛苦的过程。特别是将现有数据转换为新模式。在无模式数据库中,您的应用程序需要处理它,这给予了更多的灵活性。例如,您可以在老文档访问时即时升级架构。通过这种方式,您可以在应用程序即时处理旧版本的同时保持巨大的数据库运转。

1
谢谢。我正在参加一个MongoDB的讲座,演讲者对关系型数据库和文档型数据库之间的比较并没有提供太多启发。你的回答特别是标签更新示例非常有帮助。 - Domenic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接