SQL vs. NoSQL – 你的下一个项目应该使用哪种数据库?
最常被问到的问题之一——我应该使用哪种数据库…
SQL代表结构化查询语言。它最早是在1970年代由IBM研究团队开发的,而NoSQL数据库则是由Carlo Strozzi于1998年首次使用。
这两种数据库系统最常见的区别是SQL是关系型的,而NoSQL是非关系型的。
让我们深入了解这两种数据库,以便在下次考虑使用database for your project时能做出更好的决策。
数据库结构
我们来谈一谈结构。
SQL
SQL数据库具有明确的模式结构。
一个模式包含表,每个表包含一定数量的列。这意味着用户不能在表中更新超过指定列数的数据。当你需要维护数据完整性并确保保存到数据库的数据类型时,这非常有用。
SQL数据库中的每个表都可以相关联。也就是说,表之间可以有关系。这些关系可以是一对多、多对多或一对一的。你所实现的关系类型取决于你的需求。
例如,让我们考虑这样一个假设的情况;我们有一个公司和用户,用户可以下订单购买产品。然后,我们可以决定用户可以创建多个订单,但每个订单只能由一个用户创建。这将是一对多的关系,即一个用户对多个订单。因此,两个表的结构如下所示。
在我们的数据库中,我们可以有一个用户表,结构如下所示:
users_table
----------------------------------------------------
id | name | email
-----------------------------------------------------
1 Idris [email protected]
此外,我们可以有一个订单表
orders_table
---------------------------------------------------------------------------------
id | user_id | order_number
---------------------------------------------------------------------------------
1 1 20000001
在订单表中的user_id
使得将每个订单映射到其所属的用户变得容易。在一对一关系的情况下,如果我们决定通过相关订单id获取用户,我们还可以在users_table
上有order_id
。
对于多对多的情况,通常会涉及到一个额外的表,称为“中间表”。这样可以将多个记录映射到彼此。使用上述示例,我们将会有:
users_table
-------------------------------------------------------------------------------------
id | name | email
-------------------------------------------------------------------------------------
1 Idris [email protected]
然后订单表将会是
orders_table
---------------------------------------------------------
id | order_number
---------------------------------------------------------
1 2000001
然后中间表将保存两个ID作为外键。
根据SQL提供的结构,您可以轻松编写表之间的连接,以在一个查询中提供来自不同表的数据。
NoSQL
NoSQL数据库的灵活性比SQL数据库更大,也能容纳更大量的数据。
在NoSQL数据库中,没有预定义的模式或表。有集合,每个集合中有文档。这使您可以保存以不同形式出现的数据。您可以选择在一个集合中有多个不同的文档和不同的字段。也可以手动在集合之间建立关系,但它们不适合此目的。相反,您可以将单个查询所需的所有内容保存在同一个集合中。
如果您是使用SQL的人,可以将集合视为表,将文档视为表中的行。但您可以随意添加任何列的数据。
回到我们早些时候定义的关于公司、用户和订单的假设实例。
可以将用户集合定义为:
{id: 1, name: 'idris', email: '[email protected]'}
订单集合可以定义为:
{id: 1, order_number: 2000001, user_id:1}
但在这种情况下,我们希望避免手动连接两个集合(在这种情况下不应该这样做)。我们可以将条目保存到读取最多的集合中。我已经决定(为了这个例子)将是订单集合。
{id:1, order_number:200001, user{id:1, name: 'idris', email:'[email protected]'}}
在这种情况下,我们不再需要从用户集合读取数据,只需从订单集合读取即可,因为订单集合中包含了我们所需的所有数据。
需要注意的一点是:如果您构建的应用程序执行的读操作比写操作多,那么NoSQL选项可能更适合您。因为您可以将所有数据保存在同一个集合中,并且可以舒适地从该源读取以获取所需的所有数据。
然而,对于需要大量写入(每秒约10,000次写入)的应用程序而言,在需要将相同的数据写入多个位置的情况下,使用NoSQL选项不是一个好主意。在这种情况下,SQL选项可能更适合,其中所有表之间都存在关系,并且不需要将相同的数据重复写入多个位置,通过现有的关系,可以将一处位置的数据更新后在其他表中可用。当然,这并不意味着每个数据库都不能处理大规模。
扩展
让我们来看看扩展是如何工作的。
SQL
SQL数据库不能进行水平扩展,只能进行垂直扩展。这是什么意思呢?
水平扩展意味着将一个数据库中的数据分割成多个数据库以减轻负载。然而,由于其严格的性质,SQL数据无法在不同的数据库上进行拆分。扩展SQL数据库的正确方法是增加现有数据库服务器的CPU、内存和磁盘空间,这就是所谓的垂直扩展。
NoSQL
NoSQL数据库可以在水平和垂直方向上进行扩展。这是由于其数据存储的灵活性所致。因此,可以将数据分割到多个数据库中,就像水平扩展的情况一样。如果需要,还可以进行垂直扩展。
在这里需要注意的一点是:在扩展方面,SQL和NoSQL数据库都可以有效地进行扩展。然而,对于SQL数据库,垂直扩展可能会受到限制;单个数据库服务器将对其承载的计算能力有所限制。
在这里还需要注意的是,对于您将构建的大多数应用程序,您可能不会达到服务器计算能力的最大值,但牢记这一点是有帮助的。然而,对于实施SQL的大型业务应用程序,一个流行的选项是通过Sharding来克服这个限制。
什么是分片?
分片是将大表分成小块的过程,这些小块被称为分片。分片可以通过水平分区数据库来完成。这与水平和垂直扩展不应混淆。水平分区是指将表的行存储在多个数据库节点中的过程。而垂直分区则需要将表的列保存在不同的节点上。这使得数据库能够有效扩展并提高性能。
数据库示例
SQL
- MySQL – 一个非常流行的开源数据库。对于许多PHP开发者来说是首选数据库,但也可以与Node.js、C#、C ++、Java、Perl、Ruby和Python一起使用。
- MSSQL – Microsoft SQL提供了很大的稳定性,因为它的开发直接来自Microsoft,也在灾难恢复方面提供了一些支持。
- MariaDB – 这是由MySQL的制造商构建的MySQL,旨在将MariaDB作为永久免费版本。
- PostgresSQL – 一个非常流行的开源数据库。自诩为世界上最先进的开源数据库。
- Oracle – 这通常是针对Oracle企业解决方案定制的,其免费版本有一些限制。
NoSQL
- MongoDB – 可能是最著名的NoSQL数据库,常用于使用MERN堆栈(MongoDB,Express,React,Node)或MEAN堆栈(MongoDB,Express,Angular,Node)的应用程序开发人员。
- Firebase – 于2011年推出,2014年被Google收购,广泛用于Web和移动应用程序开发人员。
- Apache Couch DB – 一种基于文档的NoSQL数据库,将数据存储为JSON。
- Redis:这是一个NoSQL数据库,可能最著名的用途是存储具有可选生存时间的数据。它也以其速度而闻名。
结论
您可以使用SQL或NoSQL数据库创建任何类型的应用程序。这取决于您的需求。如果您正在考虑一个具有更多读取和较少写入的数据库,那么NoSQL可能是一个不错的选择。然而,如果您正在考虑构建一个写入次数超过读取次数的应用程序,那么SQL可能是更好的解决方案。在可扩展性方面,当您的应用程序达到非常庞大的规模时,您可能最终会使用这两种数据库。