在MongoDB的网站上,他们写道MonogDB是面向文档的数据库,所以如果MongoDB不是面向对象的数据库,那么它是什么?文档和面向对象数据库之间有什么区别?
答案 0 :(得分:14)
这可能有点迟了,但只是认为值得指出,ODB和MongoDB之间存在很大差异。
通常,ODB的重点是在任意复杂的域模型中的对象之间的透明引用(关系),而不必使用和管理像DBRef这样的代码。即使您有几千个类,也不需要担心管理任何键,它们是免费的,当您在运行时创建这些类的1000个实例时,它们将自动在数据库中创建模式。对于像集合集合的自引用对象这样的东西。
此外,您的交易可以跨越这些参考,因此您不必使用完全嵌入的模型。
这些概念是在ORM解决方案中利用的那些,例如JPA,托管持久对象生命周期,取自ODB空间,但巨大的区别在于ODB中没有映射AT ALL,关系存储为部分因此,没有运行时JOIN来解析关系,所有关系都以与b-tree查找相同的速度解析。对于那些使用过Hibernate的人来说,想象Hibernate没有任何映射文件,并且因为在幕后没有运行时JOIN,因此速度要快一些。
此外,ODB允许在模型中的任何关系中进行查询,因此您不必像MongoDB中那样限制特定集合中的查询。当然,支持散列/ b树/聚合索引,因此在使用它们时查询速度非常快。
您可以在类级别演进ODB中任何类的实例,并在运行时解析正确的类版本。与它在MongoDB中的工作方式完全不同,它维护代码以决定如何处理由于发展无模式数据库而产生的各种形式的blob(或值对象)...或编写代码来访问和更改每个值对象,因为你想改变架构。
就分区而言,我认为决定一个可以在仲裁对象之间进行交谈的域模型的分区模型要容易得多,那么就要找出所有的,最终的嵌入策略。您的集合包含MongoDB中的文档。作为一个简单的示例,您有一个联系人和一个地址以及一个ShoppingCart,这些在JSON文档中相关,您决定按Contact_id对Contact进行分区。绝对没有什么可以阻止你将这3个类视为对象而不是JSON文档,并将那些与分区一起存储在Contact_id上,就像使用MongoDB一样。但是,如果您有另一个对象帐户,并且您希望以非嵌入方式管理这些帐户,因为在帐户上执行了一些聚合计费操作,您可以在ODB中免费获得(不需要为DBRef类型创建代码) ...您可以选择与联系人一起分区,或者选择将帐户存储在一个完全独立的物理节点中,但它们将在运行时连接到应用程序空间......就像魔术一样。
如果你想看到一个非常酷的视频,关于如何创建一个ODB应用程序,它显示分布,对象移动,容错,性能优化..看到这个(如果你想跳到很酷的部分,跳转一下21分钟后你将避免构建应用程序,只看到为任何现有应用程序添加分发和容错是多么容易):
答案 1 :(得分:8)
我认为面向文档和面向对象的数据库是完全不同的。这里有相当详细的帖子:
答案 2 :(得分:3)
<强>文档导向强>
在我的理解中,MongoDB将每条记录视为文档,无论它是1字段还是n字段。您甚至可以在文档中嵌入文档。您不必定义在其他关系数据库系统(MySQL,PorgeSQL等)中严格控制的模式。我已经使用了MongoDB一段时间,我真的很喜欢它的哲学。
面向对象是一种数据库模型,其中信息以面向对象编程(维基百科)中使用的对象形式表示。
答案 3 :(得分:2)
面向文档的数据库是对象和关系数据库的不同概念。 文档数据库可能包含也可能不包含字段,而关系数据库或对象数据库则希望缺少的字段用空条目填充。
想象一下,将XML或JSON字符串存储在数据库表的单个字段中。这与文档数据库的工作方式类似。它只是允许半结构化数据存储在数据库中而不需要很多空字段。