最常见的问题之一是我应该使用哪个数据库?
SQL 代表结构化查询语言。 NoSQL 数据库最初由 IBM 研究人员团队于 20 世纪 70 年代开发。另一方面,NoSQL 数据库由 Carlo Strozzi 于 1998 年首次使用。
这两种数据库 (DB) 系统之间最常见的区别是 SQL 是关系型的,而 NoSQL 是非关系型的。
让我们仔细看看这两个数据库,以便您下次考虑为项目选择数据库时更好地了解情况。

数据库结构
我们来谈谈结构。
SQL
SQL数据库具有清晰的模式结构。
架构包含表,每个表包含一定数量的列。这意味着用户更新表的列数不能超过为表指定的列数。当您需要维护数据完整性或检查数据库中存储的数据类型时,这尤其有用。
SQL 数据库中的每个表都可以关联。换句话说,您可以在表之间创建关系。这些关系可以是一对多、多对多或一对一。您实施的关系类型取决于您的需要。
例如,考虑一个假设的情况。我有一个用户和一个公司,用户可以订购产品。然后,您可以决定用户可以创建多个订单,但只有一个用户可以创建每个订单。这是一种一对多的关系:一个用户和多个订单。因此两个表的表结构如下:
数据库可以包含具有以下结构的用户表:
users_table
----------------------------------------------------
id | name | email
-----------------------------------------------------
1 Idris idris@idrislawal.com您还可以创建订单表
orders_table
---------------------------------------------------------------------------------
id | user_id | order_number
---------------------------------------------------------------------------------
1 1 20000001订单表user_id允许您轻松地将订单表中的每个订单映射到其所属的用户。对于一对一关系,如果您决定通过关联的订单 ID 检索用户,则users_table还可以包含order_id 。
多对多情况通常涉及一个称为数据透视表的附加表。这允许您将多个记录相互映射。使用上面的例子。我们会这样做,
users_table
-------------------------------------------------------------------------------------
id | name | email
-------------------------------------------------------------------------------------
1 Idris idris@idrislawal.com订单表看起来像这样
orders_table
---------------------------------------------------------
id | order_number
---------------------------------------------------------
1 2000001然后,数据透视表将两个 ID 作为外键保存。
users_orders_table
------------------------------------------------------------------------------
id | order_id | user_id
------------------------------------------------------------------------------
1 1 1基于 SQL 提供的这一结构,您可以轻松地在表之间创建联接,这些联接提供来自在一个查询中联接的不同表的数据。

NoSQL
NoSQL数据库比 SQL 数据库更灵活,并且还可以包含大量数据。
NoSQL 数据库没有预定义的架构或表。我有收藏,每个收藏都有文档。这允许数据在接收时以不同的格式保存。您可以选择在一个集合中包含具有不同字段的多个不同文档。还可以手动建立集合之间的关系。然而,它不适合这样的目的。相反,您可以将单个查询所需的所有内容存储在同一个集合中。
如果您是 SQL 人员,您可能会将集合视为表,将文档视为包含表的行。但是,对于可以添加到表中的数据列没有限制。
返回到您公司的虚拟实例,其中包含您之前定义的用户和订单。
用户集合可以定义如下:
{id: 1, name: 'idris', email: 'idris@idrislawal.com'}Orders 集合可以这样定义:
{id: 1, order_number: 2000001, user_id:1}但是,在这种情况下,我不想手动组合两个集合(在这种情况下,我不应该这样做)。您可以将最常阅读的条目保存到集合中。我决定将其设为 Orders 集合(在本例中)。
{id:1, order_number:200001, user{id:1, name: 'idris', email:'idris@idrislawal.com'}}在这种情况下,您不再需要从 Users 集合中读取,只需从 Orders 集合中读取。它现在包含您需要的所有数据。
这里需要注意的重要一点是:如果您正在构建一个读取次数多于写入次数的应用程序,那么 NoSQL 选项可能更适合。因为您可以将所有数据存储在同一个集合中,并且可以轻松地从该源读取并获取所需的所有数据。
但是,对于需要大量写入(每秒大约 10,000 次写入)的这种规模的应用程序,使用 NoSQL 选项并不是一个好主意,因为它需要将相同的数据写入多个位置。在这种情况下,所有表上都存在关系,一个位置更新的数据不需要您将相同的数据重复写入多个位置,而是更新现有的关系。当然,这并不意味着这些数据库中的每一个都无法扩展。
缩放
让我们看看缩放是如何工作的。
SQL
SQL DB 不能水平扩展,只能垂直扩展。这究竟意味着什么?
水平扩展是指将数据从一个数据库拆分到多个数据库以减少负载。然而,由于其严格的性质,SQL 数据不能拆分到单独的 DB 中。要扩展SQL DB,需要适当增加现有DB服务器的CPU、内存和磁盘空间,这意味着垂直扩展。


NoSQL
NoSQL DB 可以水平和垂直扩展。这是由于数据存储的灵活性。因此,这允许您将数据拆分到多个数据库中,类似于水平扩展。如果需要,您还可以垂直缩放它。
这里需要注意的重要一点是,在扩展方面,SQL 和 NoSQL 数据库都可以有效地扩展。然而,对于 SQL DB,垂直扩展可能是一个限制。单个数据库服务器可以拥有的计算能力是有限的。
这里还需要注意的是,您构建的大多数应用程序可能无法达到服务器的最大计算能力,但记住这一点会很有帮助。然而,对于实现 SQL 的大型业务应用程序,分片是克服此限制的流行选项。
什么是分片?
分片是将大表划分为更小的块(称为分片)的过程。可以通过水平分区数据库来执行分片。不要将其与水平和垂直缩放混淆。水平分区是指将表的行存储在多个数据库节点上的过程。另一方面,垂直分区要求表的列存储在不同的节点上。这使您可以有效地扩展数据库并提高性能。
数据库示例
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 DB,在使用 MERN 堆栈(MongoDB、Express、React、Node)或 MEAN 堆栈(MongoDB、Express、Angular、Node)的应用程序开发人员中很受欢迎。
- Firebase – 于 2011 年推出,2014 年被 Google 收购,并被 Web 和移动应用程序开发人员广泛使用。
- Apache Couch DB – 一种基于文档的 NoSQL DB,将数据存储为 JSON。
- Redis:这是一个 NoSQL 数据库,最著名的可能是它用于存储具有可选生命周期的数据。它还以速度快而闻名。
结论
您可以使用 SQL 或 NoSQL 数据库创建各种应用程序。这取决于您的要求。如果您正在考虑一个读重和写重的数据库,NoSQL 可能是一个不错的选择。但是,如果您希望构建一个编写次数多于阅读次数的应用程序,那么 SQL 可能是更好的解决方案。关于可扩展性,如果您的应用程序变得非常大,您最终可能会使用这两个数据库。




![2021 年如何设置 Raspberry Pi Web 服务器 [指南]](https://i0.wp.com/pcmanabu.com/wp-content/uploads/2019/10/web-server-02-309x198.png?w=1200&resize=1200,0&ssl=1)

