我经常使用关系型数据库,但决定探索其他可用类型。
这款产品看起来很不错,很有前途:http://neo4j.org/
有人用过基于图形的数据库吗?从可用性角度来看,有什么优缺点?
您是否在生产环境中使用过这些数据库?是什么要求促使您使用它们?
我经常使用关系型数据库,但决定探索其他可用类型。
这款产品看起来很不错,很有前途:http://neo4j.org/
有人用过基于图形的数据库吗?从可用性角度来看,有什么优缺点?
您是否在生产环境中使用过这些数据库?是什么要求促使您使用它们?
我曾在之前的一份工作中使用过图形数据库。我们没有使用neo4j,而是在Berkeley DB基础上构建了一个公司内部的图形数据库,但它很相似。它被用于生产环境(现在仍在使用)。
我们使用图形数据库的原因是,系统存储的数据以及系统对数据进行的操作正是关系型数据库的弱点,而图形数据库的优势恰恰在于这些方面。该系统需要存储由关系连接起来的、缺乏固定架构的对象集合。为了对数据进行推理,系统需要执行大量操作。在图形数据库中这只需要进行几次遍历,但在SQL中则需要进行复杂的查询。
图形模型的主要优点是快速开发时间和灵活性。我们可以快速添加新功能而不影响现有的部署。如果潜在客户想要导入一些自己的数据并将其移植到我们的模型上,通常可以由销售代表在现场完成。灵活性还在我们设计新功能时提供了帮助,使我们不必试图将新数据塞进严格的数据模型中。
拥有非常规的数据库让我们构建了许多其他奇特的技术,为我们的产品提供了很多秘密酱汁,使我们的产品与竞争对手区分开来。
主要缺点是我们没有使用标准的关系型数据库技术,这对于企业客户可能会成为问题。我们的客户会问为什么不能将我们的数据托管在他们的大型Oracle集群上(通常我们的客户拥有大型数据中心)。团队中的一位甚至重写了数据库层以使用Oracle(或PostgreSQL或MySQL),但速度比原始版本稍慢。至少有一个大型企业甚至有Oracle-only策略,但幸运的是Oracle收购了Berkeley DB。我们还需要编写许多额外的工具-例如我们无法只使用Crystal Reports。
我们的图形数据库的另一个缺点是我们自己构建了它,这意味着当我们遇到问题时(通常是可扩展性方面),我们必须自己解决。如果我们使用了关系型数据库,供应商早在十年前就已经解决了这个问题。
如果你正在为企业客户构建产品,并且你的数据符合关系模型,尽可能使用关系数据库。如果你的应用程序不适合关系模型,但适合图形模型,则使用图形数据库。如果它适合其他东西,请使用该数据库。
如果你的应用程序不需要适配当前的架构,可以使用图形数据库、CouchDB、BigTable或任何适合你的应用程序并且你认为很酷的东西。这可能会给你带来优势,并且尝试新事物是有趣的。
无论你选择什么,除非你真的喜欢构建数据库引擎,否则请尽量不要自己构建数据库引擎。
我们与Neo团队已经合作一年多了,感到非常满意。我们模拟学术资料及其关系,这正是图数据库所需要的,而且在网络上运行推荐算法。
如果你已经在使用Java,我认为使用Neo4j进行建模非常简单,并且它具有比我们尝试过的任何其他解决方案更平缓/更快的读写性能。
老实说,我很难不考虑图/网络,因为与设计复杂的表结构来保存对象属性和关系相比,它要容易得多。
话虽如此,我们仍然在MySQL中存储一些信息,仅仅是因为商业部门可以更轻松地对其运行快速SQL查询。要使用Neo执行相同的功能,我们需要编写代码,但目前我们只是没有足够的带宽。一旦有了,我将把所有数据都移到Neo上!
祝你好运。
有两个要点:
首先,针对我在SQL Server上工作的数据,在过去的5年里,针对我们需要运行的查询类型(嵌套关系……你知道的……图形)我最近遇到了SQL的可伸缩性壁垒。我一直在尝试neo4j,并且发现当我需要这种查找时,我的查找时间快了好几个数量级。
其次,关于图数据库过时的观点。嗯……不是这样的。早期,人们正在尝试找出如何高效存储和查找数据,他们创建并尝试使用图形和网络式数据库模型。这些被设计为物理模型反映逻辑模型,所以它们的效率并不那么高。这种数据结构对半结构化数据很好,但对于结构密集的数据来说就不太好了。因此,这位名叫 Codd 的IBM工程师研究了安排和存储结构化数据的有效方式,并想出了关系型数据库模型的概念。这很好,人们感到很满意。
这里我们有什么呢?两个工具分别用于两个不同的目的。图数据库模型非常适合表示半结构化数据以及实体之间的关系(可能存在也可能不存在)。关系数据库适用于具有非常静态架构且连接深度不太深的结构化数据。一个适用于一种数据类型,另一个适用于其他数据类型。
总之,没有银弹这个说法。认为图形数据库模型已经过时,并且使用它放弃了40年的进步是非常短视的。这就像说使用C语言放弃了我们所经历的所有技术进步,以获得类似Java和C#之类的东西。但事实并非如此。 C是必要的某些任务的工具。而Java是其他任务的工具。
多年来,我一直使用MySQL来管理工程数据,并且一直很好用,但我们曾经遇到的一个问题(但没有意识到)是我们总是不得不事先计划模式。另一个我们知道的问题是将数据映射到域对象和返回。
现在我们刚开始尝试使用neo4j,看起来它解决了我们的这两个问题。每个节点(和关系)添加不同属性的能力使我们重新思考了数据的整个处理方式。就像动态语言(Ruby)与静态语言(Java)之间的区别,但是对于数据库而言。可以以更加敏捷和动态的方式在数据库中构建数据模型,从而大大简化我们的代码。
由于代码中的对象模型通常是图形结构,因此从数据库中进行映射也更加简单,代码量更少,因此漏洞也较少。
作为额外的奖励,我们的最初用于将数据加载到neo4j中的原型代码实际上比以前的MySQL版本运行速度更快。我还没有确切的数字(但这是一个很好的额外功能)。
但归根结底,选择可能主要应基于您领域模型的本质。它是否更适合映射到表格或图形?通过制作一些原型,加载数据并进行操作来决定。使用neoclipse查看数据的不同视图。完成这些后,希望您知道是否正在做正确的事情。