Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 关系数据库与图形数据库的比较_Sql_Relational Database_Graph Databases - Fatal编程技术网

Sql 关系数据库与图形数据库的比较

Sql 关系数据库与图形数据库的比较,sql,relational-database,graph-databases,Sql,Relational Database,Graph Databases,有人能给我解释一下像MySQL这样的关系数据库与Neo4j这样的图形数据库相比的优缺点吗 在SQL中,您有多个具有各种ID的表来链接它们。然后您必须加入以连接表。从新手的角度来看,为什么要将数据库设计为需要连接,而不是像图形数据库那样从一开始就将连接显式地作为边。从概念上讲,这对新手来说毫无意义。这大概是一个非常技术性但非概念性的原因吧?这两种风格背后实际上都有概念性的推理。维基百科对这一点做了很好的概述 主要区别在于,在图形数据库中,关系存储在单个记录级别,而在关系数据库中,结构定义在更高级别

有人能给我解释一下像MySQL这样的关系数据库与Neo4j这样的图形数据库相比的优缺点吗


在SQL中,您有多个具有各种ID的表来链接它们。然后您必须加入以连接表。从新手的角度来看,为什么要将数据库设计为需要连接,而不是像图形数据库那样从一开始就将连接显式地作为边。从概念上讲,这对新手来说毫无意义。这大概是一个非常技术性但非概念性的原因吧?

这两种风格背后实际上都有概念性的推理。维基百科对这一点做了很好的概述

主要区别在于,在图形数据库中,关系存储在单个记录级别,而在关系数据库中,结构定义在更高级别(表定义)

这有着重要的影响:

  • 在处理大量数据时,关系数据库的速度要快得多 记录。在图形数据库中,必须检查每个记录 在查询过程中单独进行,以确定 数据,而这在关系数据库中是提前知道的
  • 关系数据库使用更少的存储空间,因为它们没有 存储所有这些关系

仅当关系中存在大量变化时,在单个记录级别存储所有关系才有意义;否则,你只是一次又一次地重复同样的事情。这意味着图形数据库非常适合不规则、复杂的结构。但在现实世界中,大多数数据库需要规则的、相对简单的结构。这就是关系数据库占主导地位的原因。

Dan1111已经给出了一个标记为正确的答案。顺便提一下,还有几点值得注意

首先,在图形数据库的几乎每个实现中,记录都是“固定”的,因为在记录的当前位置有数量未知的指针指向该记录。这意味着,如果不在旧位置留下转发地址或断开未知数量的指针,就无法将记录无序移动到新位置

理论上,人们可以一次洗牌所有记录,并找出一种方法来定位和修复所有指针。实际上,在大型图形数据库上执行此操作可能需要数周时间,在此期间,数据库必须停止运行。这是不可行的

相比之下,在关系数据库中,记录可以在相当大的范围内重新排列,唯一需要做的事情是重建任何受影响的索引。这是一个相当大的操作,但远没有图形数据库的等效操作大

第二点值得注意的是,万维网可以被看作是一个巨大的图形数据库。网页包含超链接,超链接引用其他网页。引用是通过URL进行的,URL的功能类似于指针


当一个网页被移动到另一个URL而没有在旧URL上留下转发地址时,未知数量的超链接将被破坏。这些断开的链接会产生可怕的“错误404:找不到页面”消息,打断了众多冲浪者的乐趣

图形和关系数据库之间的关键区别在于,关系数据库使用集合,而图形数据库使用路径

对于RDBMS用户来说,这会以意想不到的、毫无帮助的方式表现出来。例如,当试图通过递归加入关系数据库来模拟路径操作(例如,朋友的朋友)时,查询延迟会随着内存使用量的增加而不可预测地大幅增加,更不用说它会折磨SQL来表示这些类型的操作了。在基于集合的数据库中,数据越多意味着速度越慢,即使您可以通过明智的索引来延迟痛苦


正如Dan1111所暗示的,大多数图形数据库不会遭受这种连接痛苦,因为它们在基本级别上表示关系。也就是说,关系物理上存在于磁盘上,它们被命名、定向,并且可以用属性修饰它们自己(这称为属性图模型,请参见:)。这意味着,如果您选择这样做,您可以查看磁盘上的关系,并查看它们是如何“连接”实体的。因此,关系是图形数据库中的一级实体,在语义上远远强于在运行时在关系存储中具体化的隐含关系

那你为什么要在乎呢?原因有二:

  • 对于连接的数据,图形数据库比关系数据库快得多,这是底层模型的优势。这样做的结果是,图形数据库中的查询延迟与您在查询中选择浏览的图形数量成正比,而与存储的数据量不成正比,从而消除了查询延迟
  • 图形数据库使建模和查询更加愉快,这意味着开发速度更快,WTF时间更少。例如,用Neo4j的Cypher查询语言为一个典型的社交网络表达朋友的朋友就是
    MATCH(me)-[:friend]->()-[:friend]->(foaf)RETURN foaf

    使用关系数据库,我们可以通过使用外键和自连接来建模和查询图形。仅仅因为RDBMS包含“关系”一词并不意味着它们擅长处理关系。关系数据库管理系统中的“关系”一词来源于关系代数,而不是关系。在RDBMS中,关系本身并不作为对象存在。它或者需要显式地表示为外键,或者隐式地表示为链接表中的值(当使用通用/通用建模方法时)。数据集之间的链接存储在数据本身中

    我们在re中增加的搜索深度越多