内容目录
Toggle什么是资料库?
资料库顾名思义,就是储存资料的地方,那么我们有没有办法,在不使用资料库的情况下,开发软体系统呢? 如果是早期静态式网页,只有规模较小的静态文字的话,没有资料库也是没问题的。不过随着当代系统越来越复杂,应用程式越来越丰富,我们就必须要使用资料库来去储存资料。例如:Youtube 需要庞大且复杂的资料库,来去储存不同类型、规模的资料。
当然资料库也有更精确的定义,以下是从Oracle 节录下来的定义:
资料库是结构化资讯或资料的有组织的集合,通常以电子方式储存在电脑系统中。 资料库通常由资料库管理系统(DBMS)控制。资料和DBMS 以及与其关联的应用程式一起被称为资料库系统,通常简称为资料库。
当今运行的最常见资料库类型中的资料通常以一系列表中的行和列进行建模,以提高处理和资料查询的效率。 然后可以轻松存取、管理、修改、更新、控制和组织资料。 大多数资料库使用结构化查询语言(SQL)来写入和查询资料。
资料库基本上会有两种类型,分别是:SQL(关联式资料库) 以及NoSQL(非关联式资料库),相信不少读者也有听过这些资料库的名字,其中关联式资料库是具有结构化的资料,并且资料库建立于关联模型之上,以直接且直觉的方式于资料表上显示资料。非关连式资料库则是非结构化的资料,相对发散且专为特定资料模型而建置,并将资料存放在灵活的结构,以便现代应用程式轻松扩展。 NoSQL 资料库在开发的容易性、功能性和大规模效能方面广受肯定。
资料库优点
资料库对于每个公司、组织都是非常重要的,因为这些资料库储存了所有资料,例如:一家公司的员工资料、客户资讯、交易纪录…等等。
基本上资料库有以下优点:
管理大数据:使用资料库可以轻松处理大量数据,而使用其他工具则无法做到这一点。
资料一致性:我们可以随时检索正确的资料。
资料安全性:资料库保证资料的安全,只允许授权使用者存取资料。
资料完整性:资料库透过对资料使用不同的限制来确保资料完整性。
系统可用性:资料库可以在不同的伺服器上复制(Replication),并且可以同时更新。
可扩展性:资料库被划分(Partition)来管理单一节点上的负载,提高了系统可扩展性。
ACID
ACID 是由四个单字所组成,分别是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),这四个特性也是资料库管理系统(RDBMS)在写入资料或是更新资料时,为了保证过程正确而必须要有的特性。
在资料库系统中,一个交易(Transaction)是指:由资料库操作组成的一个完整逻辑,举例来说:银行转账,从原本的帐户中扣款,并且将对方帐户新增款项,这两个资料库的操作构成一个完成的逻辑,并且是不可以分割的,这样的一个过程也包含了ACID 的特性,接下来我们简单讲解一下ACID 吧!
原子性(Atomicity)
原子性保证交易被视为不可分割的单元,代表着交易中的所有操作都必须成功,或者都不能成功。 这对于防止发生资料不一致非常重要。
一致性(Consistency)
一致性确保对资料库的所有更新都是一致的,代表资料库必须保持着有效状态,即使多个事务同时存取资料也是如此。
隔离性(Isolation)
隔离性确保交易彼此独立执行,代表说交易的操作不能干扰另一个交易的操作,这个特性对于防止资料损坏的发生非常重要。
持久性(Durability)
持久性确保交易一旦提交,其影响就是永久性,也代表交易对资料库所做的变更不会遗失,即使出现断电或其他系统故障。
关联式资料库(Relational Database)
讲完了ACID 的特性,让我们回过头来讲解资料库,关联式资料库的流行和主导地位有多种原因,包括管理通用资料的简单性、稳健性、灵活性、效能、可扩充性和相容性。
关联式资料库本质上提供了原子性、一致性、隔离性和持久性(ACID)的特性,因此本质上就是一个很好的资料库性质。还记得我们 抽象在系统设计中的应用– 系统设计02 有提到抽象的概念,ACID 也是一个抽象概念,简化了资料交互操作的复杂性。当然关联式资料库会成为主流的原因也包含:简单性、稳定性、灵活性、效能性、扩充性、相容性。
一些流行的DBMS 如下:
MySQL、Oracle Database、Microsoft SQL Server、IBM DB2、Postgres、SQLite。
关联式资料库范例
首先是关联式资料库(RDB) 是在资料表、资料列和资料栏中建构资讯。 RDB 可透过汇整资料表来建立资讯之间的关联或关系,以便轻松了解各资料点之间的关系并取得深入分析。
关联资料库原本是由IBM 的EF Codd 于1970 年代开发,允许任何资料表使用通用属性与其他资料表建立关联。可以把关联资料库想像成一个Excel 集合,可以协助公司建立资料关联。如同Excel ,每一个试算表都是储存资讯的资料表,并且使用资料栏(属性)以及资料列(纪录)表示。
GCP 范例
「客户」资料表含有客户相关资料:
客户ID (主键)、客户名称、帐单地址、收件地址
在「客户」资料表中,客户ID 是一组主键(Primary key),专门用来在关联资料库中识别客户。所有客户的客户ID 都不同。
「订单」资料表含有订单的相关交易资讯:
订单ID (主键)、客户ID (主键)、订购日期、运送日期、订单状态
假设一个小型公司使用两个资料表来处理产品订单。第一个资料表示客户资料表,纪录客户编号、客户姓名、地址、运送地址、帐单地址、电话号码、其他联络资讯。这时候的主键可以设定为客户编号,因为此资料具有唯一性,不会重复。
第二个表格表示客户订单资料表,纪录产品订单的资讯,包含:客户编号、订单编号、订购的产品、数量、尺寸、颜色。这时候的主键则可以设定为订单编号,并且不会重复。再藉由客户编号,此为共同索引键,来将两个资料表做关联建立。最终,公司订单处理应用程式将订单提交至资料库时,资料库就可以进入客户订单表,提取正确的产品订单资讯,并利用该表格的客户编号在客户资讯表中查询客户的帐单和出货资讯。
为什么选择关联式资料库(SQL)?
通常如果没有指定资料库形式,开发时我们都会预设关联式资料库。其中的优点包含,它对ACID 交易和相关程式设计的抽象。这样的抽象概念也会让软体工程师使用资料库变得非常方便,接下来分别讲讲他的优点吧!
关联式资料库优点
灵活性(Flexibility):在SQL上下文中,资料定义语言(DDL)全名为(Data Definition Language ),DDL 为我们提供了修改资料库的灵活性,包括表格、列、重新命名表和其他变更。
减少冗余(Reduce Redundancy):资料冗余(Data Redundancy)是指同一个数据或是资料在资料库中多次重复出现,在一般文件系统中,由于文件之间没有联系,所以有时候会有一笔资料在多个文件中出现。关联式资料库的最大优点之一是减少了冗。消除数据冗余的目的是为了避免更新时可能出现的问题,以便保持数据的一致性。
并发性(Concurrency):并发性是一个很重要的特性,在高并发情况下,资料会被许多使用者同时读取和写入资料库。因此我们需要协调这些操作,避免资料不一致,例如:飞机票如果同时被多个人预定,则必须要避免同时写入。 关系资料库中的并发性是透过对资料的交易存取来处理的。
备份与复原(Backup and Recovery):关联式资料库保证资料状态在任何时候都是一致的。大多数基于云端的关联式资料库都会执行连续镜像,以避免资料遗失并使复原过程更加轻松快速。
关联式资料库缺点
阻抗不匹配(Impedance Mismatch)
这边要先好好讲解一下,阻抗不区配是什么?资料库阻抗不匹配(Database Impedance Mismatch)是指在软体开发中,不同软体元件或系统所使用的资料结构和模型之间缺乏一致性时产生的常见问题。
在资料库中,阻抗不匹配指的是物件导向程式设计(OOP)模型与关系型资料库管理系统(DBMS)所使用的关系模型之间的差异。
这边也找到一只图,简单讲解所谓的不匹配的意思,图中上方为记忆体资料结构,可能是树、阵列、链结串列、杂凑…等等,右下方为关联式资料库的图例。当两者储存资料的方式不一致,在操作资料库时就会发生问题。阻抗不匹配(Impedance Mismatch)也是关联式资料库的重要缺点。
非关联式资料库(Non-relational Database)
什么是NoSQL?
NoSQL 的意思是 Not Only SQL,是一种非关联式资料库,也就是说它不使用传统的关联式资料库模型来储存资料。 NoSQL 资料库通常使用更灵活、更可扩展的资料模型,例如键值对、文件、图形或宽表。
NoSQL 资料库的类型
键值资料库(Key-value database)
键值资料库使用杂凑表(Hash Table)等键值方法以键值对的形式储存资料。键充当主键(Primary Key),值(Value)可以是从简单标量值到复杂物件的任何值。常见的键值资料库,包含:Amazon DynamoDB、Redis 、Memcached DB。
使用情境:
- 缓存: 键值资料库通常用作缓存,以快速存取经常使用的资料。例如,Web 应用程式可以使用键值资料库来缓存页面内容。
- 会话资料: 键值资料库可用于储存会话资料,例如用户登入资讯和购物车内容。
- 配置资料: 键值资料库可用于储存配置资料,例如应用程式设定和系统参数。
- 计数器: 键值资料库可用于储存计数器,例如网站流量统计资料。
文件资料库(Document database)
XML、JSON、BSON 等格式的文档都是文件资料库的中的储存形式,这些文件档案是由特别的资料结构组成,其中可以包括映射(map)、集合(collection)。常见的文件资料库,包含:MongoDB 、 Firestore。
使用情境:
- 内容管理系统(CMS): CMS 使用文件资料库来储存内容,例如文章、页面和媒体档案。
- 电子商务网站: 电子商务网站使用文件资料库来储存产品资料、客户资料和订单资料。
- 社交媒体应用程式: 社交媒体应用程式使用文件资料库来储存用户资料、帖子和评论。
- 应用程式日志: 应用程式日志使用文件资料库来储存应用程式日志资料。
- 物联网(IoT) 设备: 物联网(IoT) 设备使用文件资料库来储存感测器资料和设备状态。
图资料库(Graph database)
图资料库使用图形来储存资料,图形由节点和边缘组成,节点表示实体,边缘表示实体之间的关系,常见的图资料库包括:OrientDB 、InfiniteGraph。
使用情境:
- 社交网络分析: 社交网络分析使用图资料库来分析社交网络中的关系,例如朋友、家人和同事之间的关系。
- 推荐系统: 推荐系统使用图资料库来推荐产品或服务给用户,基于用户的兴趣和与其他用户的关系。
- 欺诈检测: 欺诈检测使用图资料库来检测欺诈行为,例如识别与已知欺诈者相关的交易。
- 知识图谱: 知识图谱使用图资料库来储存和查询有关现实世界的知识,例如实体、概念和它们之间的关系。
- 供应链管理: 供应链管理使用图资料库来管理供应链中的关系,例如供应商、制造商和零售商之间的关系。
柱状资料库(Columnar database)
柱状资料库(Columnar database) 是一种资料库,它将资料储存在列中,而不是行中。这与传统的关联式资料库不同,传统的关联式资料库将资料储存在行中,柱状资料库可以有效压缩资料,因为它们可以储存大量相同的值。常见的柱状资料库包括: HBase、Hypertable 、Amazon Redshift。
使用情境:
- 科学计算: 科学计算使用柱状资料库来分析科学资料。
- 金融分析: 金融分析使用柱状资料库来分析金融资料。
- 广告分析: 广告分析使用柱状资料库来分析广告活动的效果。
NoSQL 资料库优点
设计简单:与关联式资料库不同,NoSQL 不需要处理阻抗不匹配的情况,例如,将所有员工的资料储存在一个文件中,而不是需要连接作业的多个表。 这种策略使得编写更少的程式码、侦错和维护变得简单和容易。
水平扩展:首先,NoSQL 是首选,因为它能够在大型丛集上运行资料库。 NoSQL 资料库通常将资料分布在多个节点上,并自动平衡节点之间的资料和查询。
可用性:为了增强资料的可用性,可以在应用程式不停机的情况下进行节点更换。 大多数非关联式资料库的变体都支援资料复制,以确保高可用性和灾难复原。
成本低:许多RDBMS 的授权非常昂贵,而许多NoSQL 资料库是开源的并且免费提供。 同样,一些RDBMS 依赖昂贵的专有硬体和储存系统,而NoSQL 资料库通常使用廉价的商品伺服器丛集。
NoSQL 资料库缺点
缺乏标准化:NoSQL 不遵循任何特定标准,例如:将应用程式从一种类型的NoSQL 资料库转换到另一种类型资料库是有难度的。
一致性:NoSQL 资料库根据发生故障时,一致性和可用性是需要做考量的,并且非关联式资料库不会有好的资料完整性,资料也不是强一致的。
复杂性:NoSQL 资料库的模型和介面可能比关联式资料库更复杂,光是非关联式资料库就有好几种类型,但关联式资料库介面不会相差太多。
关系型和非关系型资料库如何选择?
很多因素会影响选择,而以下表格是关联式资料库和非关联式资料库的对比:
关联式资料库 | 非关联式资料库 |
---|---|
结构化:资料以表格形式储存,每个表格由行和列组成。行代表资料记录,列代表资料属性。资料必须符合预先定义的格式。 | 灵活:可以储存各种格式的资料,包括JSON、BSON 和图形。资料结构可以是结构化的、半结构化的或非结构化的。 |
适合OLTP(联机交易处理):擅长处理频繁的读写操作,例如订单、交易和登入。 | 适合OLAP(联机分析处理):擅长处理复杂的查询和分析,例如销售趋势、顾客行为和市场分析。 |
较难横向扩展:随着资料量的增加,效能可能会下降。需要添加更多伺服器才能处理更多资料。 | 易于横向扩展:可以通过添加更多节点来处理更多资料,而不会出现效能瓶颈。 |
ACID 保证:原子性、一致性、隔离性和持久性。资料始终保持一致,即使在多个使用者同时访问的情况下也是如此。 | 可能没有ACID 保证:资料在某些情况下可能不一致,例如在多个节点之间复制资料时。 |
模型和介面可能更复杂:需要了解SQL 等查询语言。 | 模型和介面通常更简单:易于使用和理解。 |
成熟技术:已经存在了几十年,具有广泛的支援和工具。 | 较新技术:仍在发展中,可能缺乏成熟的工具和支援。 |
相关文章
系统设计元件介绍Building Block – 系统设计05
Back-of-the-envelope 封底计算– 系统设计04