NoSql 与关系数据库
Posted
技术标签:
【中文标题】NoSql 与关系数据库【英文标题】:NoSql vs Relational database 【发布时间】:2011-05-08 19:49:01 【问题描述】:最近 NoSQL 获得了极大的欢迎。
NoSQL 与传统 RDBMS 相比有哪些优势?
【问题讨论】:
What is NoSQL, how does it work, and what benefits does it provide?的可能重复 【参考方案1】:并非所有数据都是相关的。对于这些情况,NoSQL 会很有帮助。
话虽如此,NoSQL 代表“不仅仅是 SQL”。它的目的不是敲击 SQL 或取代它。
SQL 有几个非常大的优点:
-
强大的数学基础。
声明式语法。
结构化查询语言 (SQL) 中的知名语言。
那些并没有消失。
将此视为非此即彼的论点是错误的。 NoSQL 是人们需要考虑的替代方案,仅此而已。
文档可以存储在非关系型数据库中,例如 CouchDB。
也许阅读this 会有所帮助。
【讨论】:
你能举一些非关系数据的例子吗? 文档和图像也可以像SQL Server和Oracle一样存储在RDBMS中?那为什么是 NoSQL? 半结构化数据就是这样一类。它包含 XML、电子邮件、JSON 等。请参阅上面的***页面。一般规则是结构存在,但定义松散且可动态扩展(后者倾向于使用关系模型进行分类 - 虽然并非不可能建模,但它肯定很麻烦)。另一类是“自然数据”:小说、图像,都没有附加元数据。 好吧,你不能这样做SELECT blob FROM images WHERE blob CONTAINS('red car')
。因此,虽然您可以将原始数据存储在数据库中,但如果不附加元数据就无法搜索它。 RDBMS 系统中的全文搜索模块弥补了一些半结构性的差距。
@duffymo:文档不是“非相关的”。文档通常存储在 SQL DBMS 中,您不需要 NOSQL DBMS。事实上,NOSQL 数据库通常使用比关系模型不太通用且在应用上更受限制的数据模型。例如图形数据库。存储的数据类型并不能解释 NOSQL 的任何优势。【参考方案2】:
历史看起来是这样的:
Google 需要一个存储层来存储他们的倒排搜索索引。他们认为传统的 RDBMS 不会削减它。因此,他们在 GFS 文件系统之上实现了 NoSQL 数据存储 BigTable。主要是成千上万的廉价商品硬件机器提供了速度和冗余。
其他人都意识到 Google 刚刚做了什么。
Brewers CAP theorem 已被证明。所有使用的 RDBMS 系统都是 CA 系统。人们也开始使用 CP 和 AP 系统。 K/V stores 非常简单,因此它们是研究的主要工具。
软件即服务系统通常不提供类似 SQL 的存储。因此,人们对 NoSQL 类型的存储更感兴趣。
我认为很多起飞都与这段历史有关。扩展 Google 在 Google 采用了一些新想法,其他人也纷纷效仿,因为这是他们目前知道的解决扩展问题的唯一解决方案。因此,您愿意围绕 Google 的分布式数据库理念重新设计所有内容,因为这是扩展超过一定规模的唯一方法。
C - 一致性 A - 可用性 P - 分区容差 K/V - 键/值
【讨论】:
在 Wikipedia 上查找 CAP 定理。 CA和CP源于此。 K/V 是 Key/Value 的缩写,是一种从键到值的(分布式)有限映射。【参考方案3】:NoSQL 比 RDBMS 更好,因为 NoSQL 的以下原因/特性
-
支持半结构化数据和易失性数据
它没有架构
读/写吞吐量非常高
可以轻松实现横向扩展
将支持大数据量的 Terra Bytes 和 Peta Bytes
为基于大数据的分析工具提供良好支持
可以托管在更便宜的硬件机器上
内存缓存选项可用于提高查询性能
为开发人员提供更快的开发生命周期
编辑:
要回答“为什么 RDBMS 无法扩展”,请查看由 Stavros Harizopoulos、Daniel J. Abadi、Samuel Madden 和 Michael Stonebraker 编写的 RDBMS Overheads pdf
RDBMS 在处理 TB 和 Peta 字节的海量数据方面面临挑战。即使您拥有独立/廉价磁盘冗余阵列 (RAID) 和数据粉碎,它也无法很好地扩展海量数据。您需要非常昂贵的硬件。
日志记录:收集日志记录并跟踪数据库结构中的所有更改会降低性能。如果不要求可恢复性或通过其他方式(例如网络上的其他站点)提供可恢复性,则可能不需要记录。
锁定:传统的两阶段锁定会带来相当大的开销,因为对数据库结构的所有访问都由单独的实体锁定管理器管理。
锁存:在多线程数据库中,许多数据结构必须先锁存才能访问。删除此功能并采用单线程方法会对性能产生显着影响。
缓冲区管理:主内存数据库系统不需要通过缓冲池访问页面,从而消除了每次记录访问的间接级别。
这并不意味着我们必须使用 NoSQL 而不是 SQL。
尽管如此,RDBMS 还是比 NoSQL 更好,原因如下/RDBMS 的属性
-
具有 ACID 属性的事务 - 原子性、一致性、隔离性和持久性
遵守强架构正在写入/读取的数据
实时查询管理(在数据大小
执行涉及 join & group by 子句的复杂查询
我们必须根据业务案例和要求使用 RDBMS (SQL) 和 NoSQL(不仅仅是 SQL)
【讨论】:
值得注意的是,一些 NoSQL 数据库支持 ACID 事务。【参考方案4】:NOSQL 与关系数据库模型相比没有什么特别的优势。 NOSQL 确实解决了当前 SQL DBMS 的某些限制,但它并不意味着与以前的数据模型相比有任何根本性的新功能。
NOSQL 仅表示没有SQL(或“不仅仅是 SQL”),但这并不意味着没有 关系。原则上,关系数据库将是一个非常好的 NOSQL 解决方案——只是当前的 NOSQL 产品集都没有使用关系模型。
【讨论】:
似乎在最近的 O'Reilly Strata 会议上,Mark Madsen 在他的history of databases in no-tation 中创造了对“NoSQL”的新解释,以取代“Not Only SQL”。现在是:“不,SQL”;-)【参考方案5】:RDBMS 更关注关系,NoSQL 更关注存储。
当您的 RDBMS 遇到瓶颈时,您可以考虑使用 NoSQL。 NoSQL 使 RDBMS 更加灵活。
【讨论】:
【参考方案6】:NoSQL 相对于 RDBMS 的最大优势是可扩展性。 NoSQL 数据库可以轻松扩展到多个节点,但对于 RDBMS 而言,这非常困难。 可扩展性不仅为您提供了更多的存储空间,而且还提供了更高的性能,因为许多主机同时工作。
【讨论】:
【参考方案7】:如果您需要高性能处理海量数据
或
如果没有预先确定数据模型
然后
NoSQL 数据库是更好的选择。
【讨论】:
【参考方案8】:只是添加到上面给出的所有信息
NoSql 优势:
1) NoSQL 非常适合您,因为它支持无模式和面向对象的架构。
2) NoSql db 最终是一致的,这在简单的语言中意味着它们不会像 RDBMS 那样对数据(文档)提供任何锁定,这意味着最新的数据快照始终可用,从而增加了延迟您的应用程序。
3) 它使用 MVCC(多视图并发控制)策略来维护和创建数据(文档)的快照。
4) 如果您想要索引数据,您可以创建视图,该视图将根据您提供的视图定义自动索引数据。
NoSql 的缺点:
1) 它绝对不适合大型繁重的事务性应用程序,因为它最终是一致的并且不支持 ACID 属性。
2) 它还会创建数据(文档)的多个快照(修订),因为它使用 MVCC 方法进行并发控制,因此空间消耗比以前更快,这使得压缩和重新索引更加频繁,它将随着应用程序中数据和事务的增长,减慢应用程序响应速度。 为了解决这个问题,您可以水平扩展节点,但与 sql 数据库相比,成本会更高。
【讨论】:
【参考方案9】:来自mongodb.com:
NoSQL 数据库在四个主要方面与旧的关系技术不同:
数据模型:NoSQL 数据库让您无需先定义模式即可构建应用程序,而关系型数据库让您在向系统添加任何数据之前先定义模式。没有预定义的架构可以让 NoSQL 数据库在您的数据和需求发生变化时更容易更新。
数据结构:关系型数据库是在一个数据相当结构化并由它们的关系明确定义的时代构建的。 NoSQL 数据库旨在处理构成当今存在的大部分数据的非结构化数据(例如,文本、社交媒体帖子、视频、电子邮件)。
扩展:扩展 NoSQL 数据库比扩展关系数据库便宜得多,因为您可以通过扩展廉价的商品服务器来增加容量。另一方面,关系数据库需要一台服务器来托管整个数据库。要扩大规模,您需要购买更大、更昂贵的服务器。
开发模式:NoSQL 数据库是开源的,而关系数据库通常是封闭源代码,许可费用包含在其软件的使用中。使用 NoSQL,您可以开始一个项目,而无需对软件费用进行大量前期投资。
【讨论】:
以上是关于NoSql 与关系数据库的主要内容,如果未能解决你的问题,请参考以下文章