免责声明:这是一个广泛的问题,因此可以将其移至其他来源(如果管理员认为合适)。
所有酷孩子似乎都在放弃关系数据库,转而支持他们的NoSQL同行。每个人都有自己的理由,从扩展问题到仅仅处于技术前沿。而且,我不是在质疑他们的动机。
然而,我感兴趣的是,当关系被删除时,是否有任何NoSQL转换验证了传统RDBMS的性能(维护)增益。当它存在的核心原因被删除时,我们为什么要使用RDBMS?想到几个原因
此外,我承认研究应该专注于NoSQL,并且在这个领域花费的时间显然会带来更好的互联网价值技术。但是,对NoSQL和传统RDBMS产品(减去关系)之间的排序进行比较将有助于做出业务决策。
UPDATE 1 :当我提到NoSQL数据库时,我所说的数据存储可能不需要固定的表模式,通常会避免连接操作。因此,重点放在传统SQL RDBMS中删除关系的问题
答案 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提供跨越多条记录的保证的示例:
这些功能的问题在于它们不适合分区。在所有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 变得非常受欢迎
RDBMS 由于一致性要求而面临挑战。
为了支持事务,RDBMS必须支持 ACID属性:原子性,一致性,隔离性,持久性 )。这可以通过
来实现日志记录:组装日志记录并跟踪数据库结构中的所有更改会降低性能。如果不要求可恢复性或通过其他方式(例如,网络上的其他站点)提供可恢复性,则可能不需要记录。
锁定:传统的两阶段锁定会产生相当大的开销,因为对数据库结构的所有访问都由一个单独的实体Lock Manager管理。
锁定:在多线程数据库中,必须先锁存许多数据结构才能访问它们。删除此功能并采用单线程方法会对性能产生显着影响。
缓冲区管理:主内存数据库系统不需要通过缓冲池访问页面,从而消除了每次记录访问的间接级别。
总结一下,由于上述开销, RDBMS 没有扩展,这是支持ACID事务所必需的。缺少关系不会提高RDBMS系统的性能。