应用程序开发人员可以在两大类数据库中进行选择。SQL(结构化查询语言)和NoSQL(不仅仅是SQL)。SQL数据库,也被称为关系型数据库,已经使用了40多年了。尽管年代久远,SQL数据库仍然非常受开发者的欢迎。在2021年9月DB-Engines最受欢迎的数据库管理系统名单上的前10个结果中,有6个是关系型,或基于SQL的。
NoSQL数据库,或称非关系型数据库,在过去十年中得到了普及和广泛的采用。使用最广泛的NoSQL数据库之一MongoDB在DB-Engines的名单上排名第五,是前十名中的四个非关系型数据库中排名最高的。
那么,SQL和NoSQL之间有什么区别,你应该为你的下一个应用程序使用哪种数据库?在这篇文章中,我们将探讨各自的优点和缺点。
SQL数据库
SQL语言是美国国家标准协会(ANSI)的标准,有一些方言,如PL/SQL(在Oracle)和T-SQL(在Microsoft SQL Server)。编写与ANSI兼容的SQL的好处是,你可以很容易地将你的脚本转移到另一个SQL数据库。
流行的SQL数据库包括Oracle、MySQL、Microsoft SQL Server和PostgreSQL。下面,我们来看看使SQL成为开发者中受欢迎的选择的一些特点。
SQL是关系型的
一个常见的误解是,SQL数据库被认为是关系型数据库,因为你可以使用外键定义数据库中记录之间的关系。事实上,这个名字是基于关系的数学概念,它指的是唯一元组的集合。元组只是一个有序的值的集合。
在SQL数据库中,关系被表示为一个表,关系中的每个元组在表中构成一行(通常称为记录)。这就像一个大型的、正规化的Excel电子表格,供软件使用。我们把表和行的定义称为模式。
在关系型数据库中,你可以(而且通常应该)通过不重复存储数据来规范你的数据。在过去,存储是昂贵的,而规范你的数据可以节省存储。
SQL是强大的
拥有一个模式是有利有弊的。一方面,你总是知道你的应用程序所期望的实体和值。另一方面,它不善于处理动态数据。
拥有一个模式意味着你可以验证你的数据。例如,ID字段必须是唯一的,而且不能是NULL(空)。你还可以强制建立外键关系,这意味着一条记录不能引用另一条不存在于你数据库中的记录。
有了一个规范化的数据库和这些验证措施,你的数据就会变得可靠。有了其他SQL的好处,比如交易,SQL数据库通常是快速、可靠和强大的。
NoSQL数据库
关于NoSQL数据库的一个常见误解是,"No "意味着数据库中没有使用任何SQL。如前所述,"No "代表的是 "不仅"。你可能会在NoSQL数据库中发现一些SQL。
另一个混淆的来源是,NoSQL数据库没有单一的定义。事实上,有四大类NoSQL数据库。
- 文档存储
- 图形数据库
- 键值存储
- 宽列数据存储
一些数据库,如Cosmos DB,跨越了不同的类别,但NoSQL数据库很少可以互换,而且通常看起来毫无相似之处。它们的一个共同点是,它们牺牲了一些稳健性来获得速度和可扩展性。
文档存储
最流行的NoSQL数据库类型是文档存储。文档存储看起来最像传统的SQL数据库,除了没有模式和没有规范化。你没有列和行,而只是有一个你放入的任何东西的集合。
给实体添加一个新的字段很容易,但这意味着有些实体有这个字段的定义,而有些则没有。你可以多次存储同一个实体,并使用不同的值。你也可以很容易地把事情搞得一团糟!
然而,这些数据库在具有高度动态数据的环境中茁壮成长,并且比SQL数据库的扩展性好得多。文档存储一般可以在多个服务器上运行,而SQL数据库通常被束缚在一个服务器上。由于文档存储没有所有这些讨厌的字段验证,它们的速度快如闪电。
流行的文档存储包括MongoDB、DynamoDB、Couchbase、Firebase和Cosmos DB。
图形数据库
图形数据库是NoSQL数据库的一个小众类型,相当专业。
这种类型的数据库最常见的用例是 "你可能认识的人 "的例子。想象一下一些社交网站,如Facebook或LinkedIn,它向你展示了你的朋友所认识的人。
在图数据库中,所有这些人被表示为节点,他们之间的关系被表示为边。要找到你朋友的所有朋友,你可以从一个节点开始,简单地 "走 "一遍边。你会先走你朋友的边,然后再走他们朋友的边。假设你有200或300个朋友,而这些朋友中的每一个都有200到300个朋友(有一些重叠),你最终会找到20000到60000个节点。你可以通过简单地检查这些节点的所有边来深入了解。
有了一个足够大的数据集,图数据库需要几秒钟来获取所有这些朋友的朋友。一个SQL数据库在做这件事时很快就会陷入困境。它需要匹配数以百万计的用户,每个用户都有数以百万计的用户,所有这些用户都有他们自己的数以百万计的用户,并最终过滤数以亿计的(双重)用户。
如果你需要一个图形数据库,一些流行的是Neo4j、ArangoDB和Cosmos DB。
键值存储
最直接的NoSQL数据库可能是键值存储。正如其名称所示,键值存储持有键值对的集合。值可以是任何东西,从一个数值到一个带有子对象的复杂对象。
它的适用性并不广泛,但键值存储非常适合于缓存或存储会话数据等用例。
Redis、Memcached和Cosmos DB是流行的键值存储。
宽列数据存储
宽列数据存储看起来有点像键值存储。然而,一个键不是有一个单一的值,而是持有对列的访问。
一个值可以由数十亿的列组成,并且可以是动态的。想象一下,一个无模式的SQL数据库,或者一个文档数据库,在一个键值存储里面。
宽列数据存储是可扩展的,可以容纳多达PB的数据。它们的使用情况各不相同,如时间序列数据(如多个服务器的CPU使用时间)、金融数据营销、物联网(IoT)数据和图形数据。
这种类型的流行数据库包括Cassandra、HBase、Bigtable和Cosmos DB。
其他NoSQL数据库
NoSQL包括其他类型的数据库,比如以平面文本文件为中心的数据库。另外,请记住,我们可以将SQL之前的一切都归为NoSQL。我们要提到的一种特殊类型的数据库是搜索引擎。
搜索引擎是NoSQL数据库,专门用于寻找数据内容。它们通常支持复杂的搜索查询、全文搜索、结果排名和分组,以及分布式搜索,以实现高扩展性。Elasticsearch、Solr和Splunk是流行的搜索引擎。
你现在可能已经注意到,Cosmos DB,一个在Azure中运行的云数据库,是一个几乎可以做所有事情的数据库。有各种多模型数据库,或可以用多种方式存储数据的数据库,像这样。亚马逊有自己的DynamoDB,这是一个运行在AWS中的多模型数据库。
多模型数据库有一些限制。例如,你不能在一个数据库中使用不同的方法,但你可以创建多个实例,在每个实例上使用不同的方法。
NewSQL数据库
有时,NoSQL是你唯一的选择。然而,SQL数据库已经赶上了,现在提供一些NoSQL的好处,同时仍然是SQL。例如,Oracle和SQL Server等数据库使你能够存储动态JSON,甚至对这些值使用索引和过滤查询。
一些数据库更进一步。例如,Snowflake是一个分散的SQL数据库,托管在云端。它解决了SQL不能扩展的挑战,同时仍然完全保持SQL。这些类型的数据库通常被称为NewSQL。
为了让你了解NewSQL数据库有多受欢迎,在2020年9月和2021年9月之间,Snowflake在DB-Engines的排名中上升了107位,攀升到了第21位(比Cosmos DB高出5位)!其他受欢迎的NewSQL数据库包括Cocklek和Cosmos。
其他流行的NewSQL数据库包括CockroachDB和Spark SQL。
SQL与NoSQL。如何选择
面对所有这些数据库,可能很难选择适合你的数据库。你会经常听到,"为正确的工作挑选正确的工具"。然而,正确的工具可能只是你的团队已经知道的工具。一个最佳但不熟悉的数据库可能对你的项目产生负面影响,而一个次优但熟悉的工具可能足以完成工作。
如果你决定使用一个新的数据库,无论是SQL、NoSQL还是NewSQL,确保你的团队得到正确实施所需的培训和指导。
对于大多数项目来说,SQL通常是一个不错的选择,也是一个相当强大的全能型数据库。然而,对于更专业的工作,NoSQL数据库可能是更好的选择。例如,Redis已经成为缓存的一个流行选择。如果你正在寻找一个快速和可扩展的数据库,并且在牺牲一些稳健性方面没有问题,MongoDB可能正是你需要的。
避免为了求新而追求最新和最伟大的东西。程序员可能喜欢新技术的想法,但今天的热门产品可能在五年后就会停产了。为一个已停产的产品寻找人员或支持是很有挑战性的,而在项目中期更换数据库通常是很昂贵的。
归根结底,你应该为你的下一个项目使用什么数据库,答案是:这取决于。幸运的是,有了现代架构,比如微服务,在SQL和NoSQL之间的选择并不是非此即彼的选择。它们可以在同一个应用环境中并肩存在。
总结
SQL和NoSQL在现代软件开发中都有自己的位置。它们都有各自的优势和劣势。NoSQL数据库可以纳入SQL元素,而SQL数据库可以通过新的功能和成熟的NewSQL数据库提供NoSQL的一些好处。
在选择数据库时,要考虑你的需求,以及什么对你的团队最有意义,无论是SQL还是NoSQL。