如果我们放弃关系,关系数据库是否会比NoSQL同行扩展(或更好)?

时间:2012-01-01 19:32:09

标签: sql database database-design nosql relational-database

免责声明:这是一个广泛的问题,因此可以将其移至其他来源(如果管理员认为合适)。

所有酷孩子似乎都在放弃关系数据库,转而支持他们的NoSQL同行。每个人都有自己的理由,从扩展问题到仅仅处于技术前沿。而且,我不是在质疑他们的动机。

然而,我感兴趣的是,当关系被删除时,是否有任何NoSQL转换验证了传统RDBMS的性能(维护)增益。当它存在的核心原因被删除时,我们为什么要使用RDBMS?想到几个原因

  1. 在开发这些系统方面30多年的学术和工作研究
  2. 结构化查询语言(SQL)中的一种众所周知的语言。
  3. 跨技术的稳定和成熟的ORM支持(Hibernate,ActiveRecord)
  4. 显然,在水平扩展非常重要的现代世界中,需要确保分片具有容错能力,并在应用程序所需的时间间隔内进行更新等。但是,这些需求不一定是存储数据的系统的责任(例如:ZooKeeper)。

    此外,我承认研究应该专注于NoSQL,并且在这个领域花费的时间显然会带来更好的互联网价值技术。但是,对NoSQL和传统RDBMS产品(减去关系)之间的排序进行比较将有助于做出业务决策。

    UPDATE 1 :当我提到NoSQL数据库时,我所说的数据存储可能不需要固定的表模式,通常会避免连接操作。因此,重点放在传统SQL RDBMS中删除关系的问题

5 个答案:

答案 0 :(得分:15)

我没有发现表间关系是可伸缩性的主要限制因素。我定期使用带有连接的查询,并且如果定义好索引,则可以获得良好的可伸缩性。

可扩展性的更大限制因素是同步I / O的成本。一致性和持久性的要求 - DBMS 实际上并且当它告诉您保存数据时可靠地保存数据 - 是非常昂贵的。

目前流行的几种NoSQL产品通过削弱其默认配置中的一致性和持久性保证来实现卓越性能。有很多关于CouchDB或MongoDB丢失数据的报道。

有些方法可以让NoSQL产品配置得更加严格,但是你会牺牲它们令人印象深刻的性能数字。

同样,您可以通过禁用确保数据安全的默认功能,使SQL数据库像NoSQL产品一样实现高性能。请参阅RunningWithScissorsDB

PS:如果您认为面向文档的数据库是“前沿”,我邀请您阅读MUMPS。旧的一切都是新的。 : - )

答案 1 :(得分:4)

这个问题似乎至少有两个误解。首先,“NoSQL”并不意味着“非关系”,它只是意味着SQL以外的东西。所以RDBMS也可以是NoSQL DBMS。

其次,RDBMS本身与关系*无关。关系不是关系模型的一部分,它们也可以存在于非关系数据库中(包括No-SQL数据库)。 RDBMS的“关系”部分特指 relations - 即数据结构,通常称为“表”(并且从不称为“关系”)。问题似乎是混淆了两个重要且非常不同的事物:关系和关系。

由于关系的存在与否与数据库是否是关系无关,我不确定问题是什么。如果我误解了某些内容,那么你可以稍微澄清一下这个问题。

*关系是“事物之间的关联” - 或者有时是强制执行关于此类关联的规则的数据库约束。

答案 2 :(得分:3)

SQL通常会出现扩展问题,因为它提供的保证不仅适用于一次“一行”。它们跨越行。这使得负载难以分配。以下是RDBMS提供跨越多条记录的保证的示例:

  1. 索引:一次两个基础表的原子更新(索引内部是一个表)
  2. 外键
  3. 物化视图
  4. 这些功能的问题在于它们不适合分区。在所有3种情况下,特定写入可能跨越多个分区,从而导致扩展问题。

    NoSQL通常只是通过禁用这些功能来“解决”这个问题; - )

    阻止SQL的下一个问题是它默认提供ACID语义。这不是关系模型中固有的 - 它是一个实现细节。

    因此,如果您关闭那些难以分发/分区并禁用ACID的功能,您将获得NoSQL性能。实际上看一下HandlerSocket如何用MySQL做到这一点。它具有NoSQL速度,虽然它在InnoDB上运行并提供标准的全功能SQL接口(它实际上只是标准MySQL服务器上的无功能旁路)。

    NoSQL没有什么神奇之处,只有更少的功能。哪个好。这是一个不同的权衡。

答案 3 :(得分:0)

我认为使用RDBMS或NoSQL的优缺点实际上取决于数据以及您打算如何使用它。据我所知,交易实际上与关系数据库很好地表示。我对NoSql的体验是使用Infinite Graph& Neo4j的。取证是NoSQL的一个很好的用例,每个人都是节点/顶点,边缘可以代表不同类型的通信(电子邮件,电话,面对面会议,载体鸽等等)。然后,您可以使用特定条件获取可疑/顶点并遍历图形,以查找两个看似未连接的个体实际连接的方式(可能比传统的关系数据库效率更高)。社交图数据是另一个很好的例子,每个用户都是节点/顶点,而关系(朋友)是连接两个节点的边。简而言之,您的数据是否代表最佳?用表或节点/边缘检索。

答案 4 :(得分:0)

关系不是比较 RDBMS NoSQL 之间性能的好标准。

由于许多因素,

NoSQL 变得非常受欢迎

  1. 水平可扩展性。
  2. 支持非结构化&半结构化数据
  3. 读/写吞吐量
  4. 廉价的硬件成本等。
  5. 查看RDBMS Overheads

    RDBMS 由于一致性要求而面临挑战。

    为了支持事务,RDBMS必须支持 ACID属性:原子性,一致性,隔离性,持久性 )。这可以通过

    来实现

    日志记录:组装日志记录并跟踪数据库结构中的所有更改会降低性能。如果不要求可恢复性或通过其他方式(例如,网络上的其他站点)提供可恢复性,则可能不需要记录。

    锁定:传统的两阶段锁定会产生相当大的开销,因为对数据库结构的所有访问都由一个单独的实体Lock Manager管理。

    锁定:在多线程数据库中,必须先锁存许多数据结构才能访问它们。删除此功能并采用单线程方法会对性能产生显着影响。

    缓冲区管理:主内存数据库系统不需要通过缓冲池访问页面,从而消除了每次记录访问的间接级别。

    总结一下,由于上述开销, RDBMS 没有扩展,这是支持ACID事务所必需的。缺少关系不会提高RDBMS系统的性能。