3

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

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

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

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

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

4

1 回答 1

5

好吧,这取决于您的数据的结构方式和数据访问模式。

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

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

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

于 2010-06-13T22:51:43.453 回答