总结数据库基础,并关注RDB和NoSQL之间的区别(初级篇)
数据库(DB)被用于以易于利用的形式持久管理大量数据。在运营Web服务等领域中,适当管理服务和用户数据非常重要,因此本文将为初学者总结数据库的类型和它们的使用场景,以基础知识为主要内容。
数据库的类型
首先,我们将关注它们的结构,并介绍三种不同的数据库。当然,它们都有一个共同的角色,即保存数据,但是由于在保存数据时的结构上有各自的特点,希望您在阅读时能够理解它们之间的差异。
1. 分层数据库
优点
層次数据库的优点在于访问特定数据时具有唯一路径,因此搜索速度非常快。
缺点
階層型数据库的缺点是当子节点属于多个父节点的情况发生时,必须重复注册数据。在上图中,例如,如果员工A不仅参与项目1,还参与项目2,那么需要在项目2下重新添加员工A。这样员工A就会重复注册到数据库中,导致结构冗余。
2. 网络型数据库
优点
网络型数据库的长处是,子节点可以拥有多个父节点。这样一来,就可以避免层次型数据库中的冗余结构问题。
缺点
网络型数据库的缺点是数据结构复杂,难以理解。虽然子节点可以有多个父节点的特点从冗余性的角度来说是优点,但与分层型数据库相比,也包含了结构变得复杂的缺点。如果无法理解结构,将最终无法访问数据。
3. 关系型数据库(RDB)
优点
RDB的优点是可以通过使用表来处理复杂的数据,使其易于理解。此外,由于消除了父子概念,因此不再需要遍历树结构来操作数据,而是可以直接操作各个数据。稍后会详细说明,RDB的数据操作是通过使用SQL语言进行的。
弱点
在关系数据库(RDB)中,通常需要使用多个表,因此为了正确处理数据,必须始终保持这些表之间的一致性。可能对于”一致性”这个词有点难以理解,我在这里补充说明一下。例如,在上述表中,领导者的信息被记录在员工ID中,但仅凭员工ID我们无法确定实际上是哪位员工,因此需要另外准备一张表来表示员工编号和员工间的关系。
假设在这种情况下,员工ID001的佐藤因为某种原因辞职,员工ID004的高桥接手了A项目的领导职务。这种情况下,首先因为员工离职,员工表会发生更新。接着由于A项目的领导变更,项目表也必须被修改。如果这个连续的更新操作没有延迟并且正确执行,那么可以说数据库保持一致性。如果只有其中一项更新被执行,那么数据库就会出现不一致。因此,在使用关系型数据库时,需要注意保持一致性。
補充
在这里,我简单地解释一下刚才提到的SQL。SQL是用于操作关系数据库的编程语言。关系数据库的操作基本上可以分为四个部分,并且这四个部分的首字母缩写是CRUD(创建、读取、更新、删除)操作。
在这里我们只简要提及,如果正确使用SQL,例如在上述的员工表中进行“年龄在30岁以上并且属于技术部门的员工”的条件搜索也可以轻松执行。顺便提一下,SQL命令具有国际标准,无论RDB的类型如何,都保持了一定的统一性,但并不完全相同,所以在每个RDB中需要根据情况选择使用。
非关系型数据库
在之前的说明中,提到了现在主流的数据库是关系型数据库(RDB)。那么,使用RDB可以保证世界上所有的应用都可以正常运行吗?很遗憾,RDB并不是万能的数据库。实际上,有些应用在RDB中处理起来比较困难,为了弥补RDB的缺点,出现了一种被称为NoSQL(Not Only SQL)的数据库类型。我们将在这里介绍NoSQL的特点,但为了更易理解,首先我们希望稍微深入探讨一下RDB的问题。
RDB的问题。
在之前对关系型数据库的缺点进行解释时,我提到了 “必须设计以保持数据的一致性”,但准确来说,”能够保持数据的一致性”本身就是使用关系型数据库的一项重大优点。然而,为了保证这一优点,必须付出牺牲性能的代价,这就构成了关系型数据库的问题所在。
1. 低分散性
从减轻服务器负载和处理服务器故障的角度来看,最好将数据库服务器分散设置。然而,如果将数据库服务器分散,例如多个服务器同时发生数据更新,数据的一致性就无法保证。因此,可以说数据库服务器的分散是困难的,至少对于数据的写入而言。
2. 不具备良好的扩展性
当处理的数据量增加时,无疑需要扩展服务器。然而,由于类似于“分布式”的原因,(至少对于数据写入来说)数据库服务器的扩展目前是困难的。
3. 处理速度很慢
因为关系型数据库在内部进行了各种处理以保持数据的完整性,所以在处理大量数据时可能会遇到速度不足的问题。
4. 修改模式困难。
首先,模式指的是数据的结构。在关系型数据库中,通过使用表格,数据结构变得更加清晰明了。但另一方面,这也意味着无法输入不符合表格模式的数据。当然,这并不意味着模式是绝对不可更改的,但后期修改模式是非常麻烦的。另外,由于输入的数据结构可能是不确定的,因此在某些情况下,在这种应用中使用关系型数据库是困难的。
满足不足之处。
本文介绍了为了保持数据的一致性而进行的“事务”和“验证”处理。事务是确保多个表的数据更新能够无矛盾进行的功能。当数据更新需要修改多个表时,如果只对部分表进行修改而导致处理不完整,就会导致数据不一致。通过进行事务处理,可以防止出现这种情况。如果万一在事务处理过程中出现了任何问题,可以将数据库状态恢复到事务处理之前(回滚)。另一方面,验证是对要写入数据库的数据设置条件。一个易理解的例子是,“密码必须至少有◯◯个字符”也是其中一种验证。通过这样做,可以防止将意外奇怪的数据写入数据库。
NoSQL的特点
总的来说,NoSQL具有解决上述关系数据库(RDB)问题的功能。因此,NoSQL的魅力在于其具有高度的分布性和可扩展性,能够处理不确定的数据模式,并且具有快速的处理速度。这样说的话,可能会让人误以为NoSQL比RDB更优越,但事实并非如此。NoSQL放弃了RDB的数据一致性这一重大优点来解决RDB的问题。因此,RDB和NoSQL并非一个更优越或更劣等的选择,而是根据应用程序的需求来适当选择使用。
在使用RDB和NoSQL时需要考虑的因素
根据之前的解释,用一句话概括两者的区别就是“如果更注重数据的可靠性(一致性),即使处理速度慢一点也可接受,则选择关系型数据库(RDB);如果不太重视数据的可靠性(一致性),只是追求大量数据的高速处理,则选择非关系型数据库(NoSQL)”。
因为仅仅依靠一般的论述可能会有一些难以理解,所以我将举一个(虚构的)具体例子来说明。
金融机构的交易管理
在这个情况下,使用关系数据库(RDB)和非关系数据库(NoSQL)哪个是合适的呢?金融机构的交易管理涉及到管理用户之间的资金流动。在涉及到资金的场景中,数据的不一致绝对不能发生。例如,当A向B转账10万元时,如果A的账户减少了10万元,但B的账户没有任何变化,那将是一个严重的问题。因此,在这种情况下,可以说应该使用可以保证数据一致性的关系数据库(RDB)。
2.每个用户在热门电子商务网站上的产品浏览历史。
在这种情况下怎么办?首先,因为它是热门电子商务网站的产品浏览记录,所以预计处理的数据量要比金融机构的交易数据庞大。因此,考虑到数据处理速度很重要。此外,由于它是产品浏览记录,所以可能不需要像金融机构交易数据那样严格的数据一致性。因此,在这种情况下使用NoSQL数据库似乎更合适。
希望您将上述例子仅视作形象参考,因为其前提条件等非常模糊不清。
近年来,由于处理数据量的增加趋势,采用RDB提升服务器性能的方法已经不再适用于许多情况。尽管RDB仍然是主流,但预计NoSQL的重要性将进一步提高。
非关系型数据库(NoSQL)的结构。
我們已經在與關聯式數據庫進行比較的過程中介紹了NoSQL的特點,但實際內容是什麼樣的結構呢?在這裡我們將重點介紹NoSQL的分類,主要關注於數據結構。
1. 键值对形式 zhí duì shì)
键值型的NoSQL数据库,顾名思义,具有由键和值组成的数据结构。下面以表格为例进行具体说明。键扮演数据的ID角色,一旦确定了键,与之相关的值(数据)也就确定了一个。以表格的示例来说,当时间(键)确定时,相应的温度(值)也就确定了。
由于数据结构较关系型数据库(RDB)更简单,因此可以提高处理速度。具体例中的值是单一的,但也可以将其设置为列表等以包含多个值。作为键值对数据库,有Redis、Riak等。
2. 文档型
在NoSQL的文档型中,可以处理的数据格式为JSON和XML。以下是每种数据格式的具体示例,与键值对相比,它们可以处理更复杂的数据。然而,与关系型数据库不同的是,无需事先定义模式,因此可以处理灵活的数据。作为文档型数据库有MongoDB、CouchDB等。
[
{'ID': '001','Name': 'Tanaka', 'Division': 'Sales'}
{'ID': '002','Name': 'Yoshida', 'Division': 'Engineering'}
]
<?xml version='1.0' encoding='utf-8'>
<root>
<employee>
<employ>
<ID>001</ID>
<Name>Tanaka</Name>
<Division>Sales</Division>
</employ>
<employ>
<ID>002</ID>
<Name>Yoshida</Name>
<Division>Engineering</Division>
</employ>
</employee>
</root>
3. 列向型
以列为导向的NoSQL与关系数据库(RDB)一样,其数据结构也是表格的形式。不同之处在于对待数据的方式。虽然在关系数据库的描述中没有详细提及,但关系数据库是以行为单位处理数据的。我们再次使用关系数据库的描述中的表格,关系数据库可以根据「员工ID为001的数据」进行搜索,得到「佐藤、35岁、技术○○科、satoh@example.com」这样的数据。
就像它的名称所示,列式数据库处理数据以列为单位。因此,在需要进行批量列处理的情况下,它比关系数据库更快且更有用。Cassandra和HBase是一些列式数据库的例子。
4. 图表类型 (tú
在图形型的NoSQL中,数据的结构如下图所示。这个图形结构由节点、边和属性来描述。
-
- ノード・・・頂点を意味し、図中の薄灰色の丸がそれに該当する。ラベル(図中のUser)を付与されていることが多い。
-
- エッジ・・・辺を意味し、図中の矢印がそれに該当する。ノード間の関係性を表すのに用いられる。
- プロパティ・・・ノードやエッジの属性を表す役割を持つ。図ではFollow, Name, Ageなどが該当。
图形数据库的最大特点是每个数据之间的关系都被明确地嵌入其中。在关系型数据库(RDB)中,数据的管理往往涉及多个表,虽然可以定义表之间的关联性,但无法直接定义每个数据之间的关系。因此,图形数据库具有比RDB更快的数据检索速度的优势。正如具体例中的图所示,它在表示社交网络中用户之间的连接等方面非常有效。作为图形数据库,Neo4j等工具可以使用。
在实际操作中,数据库如何被操作?
到目前为止,我们已经对各个数据库的特点和结构进行了解释。虽然这些都是非常重要的事情,但是在我们进行应用开发等工作时,如果不能对数据库进行数据保存、数据读取等操作,就无法开始工作。在这里,我想解释一下如何操作数据库的数据。
1. ORM(对象关系映射)
剛才我提到”RDB的數據是使用SQL語言進行操作”,這確實是正確的。例如,如果要在員工(Employee)表中添加一個”年齡25歲,所屬技術部,郵箱地址yoshida@example.com,員工ID為005的吉田”這樣的員工,可以按照以下的SQL語句進行添加。
INSERT INTO Employee (ID, name, age, division, mail) VALUES ("005", "yoshida", 25, "技術xx課", "yoshida@example.com");
然而,考虑到实际进行应用程序开发等工作的情景,我们可以发现这种方式存在不便之处。SQL语言只是用于操作RDB数据的语言,并不是我们开发应用程序(如实现登录功能等)时使用的语言。在Web应用程序开发中,例如使用PHP和Laravel等框架,仅在需要进行与数据库交互时才使用SQL语言,带出SQL语言可能会不方便且耗费时间。因此,ORM是一种”无需明确使用SQL语言即可操作数据库”的功能。
ORM是Object Relational Mapper的缩写。Relational指的是关系数据库,即RDB。Object指的是面向对象的对象,Mapper可以理解为“映射”的意思。使用对象的好处是,例如在像PHP这样的面向对象语言中,可以直接处理对象,而不需要再次使用SQL进行数据库操作。举个例子,对于php/Laravel来说,刚刚SQL中示例的数据添加操作将如下所示。
$employee = new Employee
$employee->ID="005"
$employee->name="yoshida"
$employee->age=25
$employee->devision="技術xx課"
$employee->mail="yoshida@example.com"
$employee->save()
创建一个名为”employee”的实例,为其属性如ID、姓名等赋值,并通过名为”save”的方法保存。尽管涉及与数据库相关的操作,但最终所做的与处理普通对象没有太大区别。
填補
爲了避免誤解,我想補充一點,ORM並不意味著不使用SQL。SQL實際上是寫在Employee的父類Model中,數據庫操作的本質還是通過SQL進行的。
2. 厂家代加工
ODM是Object Document Mapper的简称。ORM中的Relational被替换为Document。换句话说,ODM的目标不再是关系型数据库(RDB),而是文档型的NoSQL数据库。然而,ODM和ORM一样,仍然通过对象来操作数据库。
我想要关注的是,通过使用ORM和ODM,开发者无论是使用关系数据库还是NoSQL数据库,只需要处理对象即可。换句话说,ORM和ODM可以在不太意识到不同类型数据库的差异的情况下混合使用,这也带来了一些好处。
我已经总结了以上关于数据库基本内容的概述。如果有任何错误或建议,请指正。