数据库设计基础知识
- 6.1 数据库基本概念
- 6.1.1 数据库技术的发展
- 6.1.2 数据模型
- 6.1.3 数据库管理系统
- DBMS功能
- DBMS 的特点
- 6.1.4 数据库三级模式
- 6.2 关系数据库
- 6.2.1 关系数据库基本概念
- 关系的基本术语
- 关系数据库模式
- 关系的完整性约束
- 6.2.2 关系运算
- 6.2.3 关系数据库设计基本理论
- 6.3 数据库设计
- 6.3.1 数据库设计的基本步骤
- 6.3.2 数据需求分析
- 6.3.3 概念结构设计
- 6.3.4 逻辑结构设计
- 6.3.5 物理设计
- 6.3.6 数据库实施
- 6.3.7 数据库运行维护
- 6.4 应用程序与数据库的交互
- 6.4.1 库函数级别访间接口
- 6.4.2 嵌入SQL访问接口
- 6.4.3 通用数据接口标准
- 6.4.4 ORM访问接口
- 6.5 NoSQL数据库
- 6.5.1 分类与特点
- 6.5.2 体系框架
6.1 数据库基本概念
- 数据是描述事物的符号记录,可以是文字、图形、图像、声音和语言等形式。
- 信息是现实世界事物的存在方式或状态的反映,具有可感知、可存储、可加工、可传递和可再生等属性。
- 数据库系统(DBS)是一个采用数据库技术的计算机系统,有组织地、动态地存储大量相关联数据,方便多用户访问。
- 数据库(DB)是统一管理的、长期存储在计算机内的、有组织的相关数据的集合。
- 数据库管理系统(DBMS)是数据库系统的核心软件,由一组相互关联的数据集合和用于访问这些数据的软件组成。
- DBMS在操作系统的支持下工作,解决如何科学地组织和存储数据、高效获取和维护数据的问题。
总之,数据库系统和数据库管理系统是处理数据和信息的重要工具,能够有效地存储和管理大量相关联的数据,并提供对数据的高效访问和操作功能。
6.1.1 数据库技术的发展
数据处理是对各种数据进行收集、存储、加工和传播的一系列活动,而数据管理则是对数据进行分类、组织、编码、存储、检索和维护的活动。数据管理技术经历了人工管理阶段、文件系统阶段和数据库系统阶段。
-
在人工管理阶段,由于计算机主要用于科学计算,数据处理是通过手工进行的。这个阶段的特点是数据量较少、数据不保存以及缺乏软件系统对数据进行管理。手工处理数据存在依赖性强、数据冗余等问题。
-
随着辅助存储设备的出现,进入了文件系统阶段。在文件系统中,数据被组织成文件,并通过文件系统进行存取和加工。文件系统阶段的特点包括数据可以长期保留、数据的逻辑结构和物理结构有区别、数据可重复使用等。然而,文件系统存在数据冗余、数据不一致性和数据孤立等问题。
-
最后进入了数据库系统阶段,其中数据库系统由计算机软件、硬件资源组成,能够组织地、动态地存储大量关联数据,实现数据的共享和交叉访问。数据库系统的特点包括采用复杂的数据模型表示数据结构、具有高度的数据独立性以及提供数据完整性、一致性和安全性管理手段。数据库系统相较于文件系统具有数据共享性、操作方便性和数据的高度独立性等优势。
数据处理和数据管理是相互关联的活动,随着技术的不断发展,数据管理从人工管理到文件系统再到数据库系统,逐步提高了数据的组织和利用效率。
6.1.2 数据模型
数据库的基础结构是数据模型,包括数据结构、数据操作和数据的约束条件。历史上,数据库发展经历了三个阶段:层次和网状数据库系统、关系数据库系统和第三代数据库系统。
- 层次和网状数据库系统采用树形结构或网络结构表示数据间的联系;
- 关系数据库系统采用表格结构表达实体集和实体集之间的联系;3
- 第三代数据库系统包括了多种新型的数据模型,如面向对象模型、语义数据模型、XML数据模型和NoSQL数据库模型。NoSQL数据库主要针对大规模数据和高并发的应用,强调非关系型的特点和处理大规模数据的优势。
6.1.3 数据库管理系统
DBMS功能
- DBMS的功能包括数据定义、数据库操作、数据库运行管理、数据组织、存储和管理以及数据库的建立和维护。
- 数据定义功能通过数据定义语言(DDL)对数据库的结构进行描述,包括外模式、模式和内模式的定义,以及数据库的完整性定义和安全保密定义。
- 数据库操作功能提供数据操纵语言(DML),实现对数据库中数据的基本操作,如检索、插入、修改和删除。
- 数据库运行管理功能涉及多用户环境下的并发控制、安全性检查和存取控制、完整性检查和执行、运行日志的组织管理、事务管理和自动恢复等。
- 数据组织、存储和管理功能涉及数据字典、用户数据和存取路径的组织、存储和管理,以提高存取效率和存储空间利用率。
- 数据库的建立和维护功能包括数据库的初始建立、数据的转换、数据库的转储和恢复、数据库的重组和重构,以及性能监测和分析等。
- 其他功能包括与网络中其他软件系统的通信功能,以及与其他DBMS或文件系统的数据转换功能。
DBMS 的特点
- DBMS实现数据的统一管理和结构化存储,通过数据模型描述数据之间的联系,实现数据共享和减少冗余。
- 数据的独立性是DBMS的重要特点,包括物理独立性和逻辑独立性,使得应用程序只需要关注数据的逻辑结构。
- 数据库的安全性、完整性、并发控制和故障恢复是DBMS提供的数据控制功能,保证数据库在多用户环境下的正确性和可靠性。
6.1.4 数据库三级模式
- 数据库系统采用三级模式结构,分别是外模式、概念模式和内模式。
- 视图层、逻辑层和物理层是对数据库系统的不同抽象层次的描述。
- 概念模式是数据库中全部数据的逻辑结构和特征的描述,只涉及“型”的描述,不涉及具体的值。
- 外模式是用户与数据库系统的接口,是用户需要使用的部分数据的描述。
- 内模式是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式。
三级模式结构提供了数据的物理独立性和逻辑独立性,使得数据库系统更加灵活和可维护。
6.2 关系数据库
关系模型是关系数据库的基础,由关系数据结构、关系操作集合和关系完整性规则3部分组成。
6.2.1 关系数据库基本概念
关系数据库系统是支持关系数据模型的数据库系统,其应用了数学方法来处理数据。关系数据库的理论基础由E.F.Codd在1970年提出,并在之后的几十年取得了辉煌的成就。商业化的关系数据库管理系统如IBM DB2、Oracle、Ingres、SYBASE、Informix等得到广泛应用。关系数据库系统在各个领域的应用也迅速扩大。
关系的基本术语
- 属性 (Attribute): 在现实世界中,用于描述事物的特征称为属性。例如学生可以通过学号、姓名、性别、系别、年龄、籍贯等属性进行描述。
- 域 (Domain): 每个属性都有一个取值范围,该范围对应着属性的域。例如,学号的域是6位整型数;姓名的域是10位字符;性别的域为{男,女}等。在关系数据模型中,属性的域应为原子数据,即不能再进行分解。这种限制称为第一范式 (First Normal Form, 1NF)。
- 度 (Degree): 关系中属性的个数称为度。
- 候选码 (Candidate Key): 若一个或多个属性的值能够唯一标识一个元组,则称这个属性或属性组为候选码。
- 主码 (Primary Key): 当一个关系存在多个候选码时,从中选取一个作为主码。
- 主属性 (Prime Attribute): 包含在任何候选码中的属性称为主属性,不包含在任何候选码中的属性称为非主属性。
- 外码 (Foreign Key): 如果一个关系模式R中的属性或属性组不是该关系的候选码,但它是其他关系的候选码,那么该属性集对于关系模式R而言就是外码。
- 全码 (All-key): 关系模型的所有属性组都是该关系模式的候选码,称为全码。
- 笛卡尔积:在关系数据库中,笛卡尔积是指将两个或多个表中的每一行进行组合,生成一个新的表。它用于获取所有可能的组合结果。对于两个表A和B,它们的笛卡尔积可以表示为A × B。这个操作常用于建立连接或进行数据的组合查询。
关系数据库模式
关系数据库模式是关系数据库的结构描述,包括域的定义和关系模式的定义。关系数据库的值则是关系模式在某一时刻对应的关系的集合,也称为关系数据库。
具体来说,关系数据库模式由以下两部分组成:
-
域的定义:每个属性都有一个取值范围,该范围对应着属性的域。域定义了属性可以取值的类型和限制条件,例如整数、字符串等。
-
关系模式的定义:关系模式是对关系的结构和约束进行描述。它包含了关系的名称和属性的集合,以及对这些属性的约束条件,如主键、外键、唯一约束等。
关系数据库的值则是关系模式在某一时刻对应的实际数据。值是关系的集合,其中每个关系表示了表中的一组数据。关系由行和列组成,每一行表示一个元组(tuple),每一列表示一个属性,每个元组的值对应于相应属性的数据。
举个例子来说明,假设有一个关系数据库模式如下:
学生表(Student):
学号 | 姓名 | 年龄 |
---|---|---|
101 | 张三 | 20 |
102 | 李四 | 22 |
课程表(Course):
课程号 | 课程名 |
---|---|
C101 | 数据库 |
C102 | 算法 |
在这个例子中,学生表和课程表分别是关系模式,描述了学生和课程的属性和结构。而具体的学生数据和课程数据则是关系数据库的值,表示了实际的学生信息和课程信息。例如,学生表中的第一行记录表示学号为101的学生叫张三,年龄为20岁。
关系的完整性约束
关系的完整性约束用于保证数据的一致性,防止对数据的意外破坏。主要分为以下三类:
-
实体完整性 (Entity Integrity):要求每个数据表都必须有主键,并且作为主键的所有字段的属性必须是唯一且非空的。例如,在一个学生表中,学号可以作为主键,保证每个学生的学号都是唯一且非空的。
-
参照完整性 (Referential Integrity):描述了关系模型中实体之间的联系和引用。如果一个关系R的外码F与另一个关系S的主码Ks相对应,则对于关系R中的每个元组,在F上的值要么为空值,要么等于关系S中某个元组的主码值。例如,如果有一个员工表和一个部门表,员工表中的部门编号字段作为外码与部门表的主码对应,这样就可以通过参照完整性来确保员工表中的部门编号必须是有效的部门编号。
-
用户定义完整性 (User Defined Integrity):针对特定的关系数据库设计,反映了某个具体应用所涉及的数据必须满足的语义要求。这些约束是由应用程序的环境决定的。例如,银行系统中可以定义用户账户余额必须大于等于100000,小于999999这样的规则,以确保账户余额的有效范围。
6.2.2 关系运算
关系操作的特点是操作对象和操作结果都是集合,其中操作包括集合运算符、专门的关系运算符、算术比较符和逻辑运算符。
-
集合运算符:包括并、交和差。并操作符(∪)用于将两个关系的元组合并成一个新的关系,交操作符(∩)用于获取两个关系的共有元组,差操作符(-)用于从一个关系中剔除另一个关系中的元组。
-
专门的关系运算符:包括选择、投影、连接和除法。选择操作符(σ)根据给定的条件选择满足条件的元组,投影操作符(π)则将关系中的某些属性投影到一个新的关系中。连接操作符(⨝)用于将两个关系的元组按照某种条件连接起来,除法操作符(÷)用于求解某个关系在另一个关系中的商。
-
算术比较符:用于对关系中的属性进行比较,包括等于(=)、不等于(<>)、大于(>)、小于(<)、大于等于(>=)和小于等于(<=)。
-
逻辑运算符:用于对关系进行逻辑运算,包括与(AND)、或(OR)和非(NOT)。
6.2.3 关系数据库设计基本理论
-
函数依赖(Functional Dependency):函数依赖是指在关系模式中,一个属性或属性集合的取值能够决定另一个属性的取值。例如,如果在关系R(A, B, C)中,属性A的取值能够唯一地决定属性B的取值,则可以表示为 A→B。函数依赖在关系数据中起到了约束和规范的作用,帮助保证数据的一致性和完整性。
-
多值依赖(Multivalued Dependency):多值依赖是指在关系模式中,一个关系中的某个属性集合对于另一个属性集合的取值具有多个可能的依赖关系。例如,如果在关系R(A, B, C)中,属性A和属性B的取值决定了属性C的取值,同时属性A和属性C的取值决定了属性B的取值,则可以表示为 A→→C 和 A→→B。多值依赖的存在可能引起数据冗余和不一致性,需要进行规范化来消除。
-
规范化(Normalization):规范化是指通过分解关系模式,将其转化为更小、更简洁、更符合数据库设计原则的关系模式的过程。规范化的目标是消除数据冗余和不一致性,提高数据库的性能和可维护性。常用的规范化形式包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)等。每个范式都有特定的依赖关系要求,例如1NF要求属性具有原子性,2NF要求非主属性完全依赖于候选键,3NF要求非主属性不存在传递依赖等。
通过函数依赖和多值依赖的分析,可以进行规范化的过程,将关系模式分解成更小的、符合范式要求的关系模式,从而提高数据库的设计质量和性能。
6.3 数据库设计
6.3.1 数据库设计的基本步骤
数据库设计一般包括以下六个阶段:
- 用户需求分析:通过对应用对象的功能、性能和限制等要求进行科学分析,确定用户的需求。
- 概念结构设计:将用户需求抽象为独立于计算机系统的企业信息模型,常用的工具是实体-关系(E-R)图。
- 逻辑结构设计:将概念模型转化为与选用的数据库管理系统(DBMS)所支持的数据模型相符合的逻辑模型。包括模式初始设计、子模式设计、应用程序设计、模式评价和模式求精。
- 物理结构设计:在计算机中具体实现逻辑模型的方案。包括数据存储结构、索引设计、文件组织方式等。
- 数据库实施阶段:根据逻辑设计和物理设计的结果建立数据库,编制和调试应用程序,组织数据入库,并进行试运行。
- 数据库运行和维护阶段:数据库应用系统经过试运行后投入正式运行,需要不断对系统进行评价、调整和修改,以保证系统的稳定性和效率。
6.3.2 数据需求分析
数据需求分析是在项目确定之后,用户和设计人员对数据库应用系统所要涉及的内容(数据)和功能(行为)的整理和描述。需要进行详细调查,在了解现行系统的概况,确定新系统功能的过程中,收集支持系统目标的基础数据及处理方法。分析和表达用户需求的方法主要包括自顶向下和自底向上两类方法。自顶向下的结构化分析方法从最上层的系统组织机构入手,采用逐层分解的方式分析系统,并把每一层用数据流图和数据字典描述。需求分析的重点是调查组织机构情况、调查各部门的业务活动情况、协助用户明确对新系统的各种要求,以此获得用户对系统的信息要求、处理要求和系统要求等。
数据需求分析是后续开发的基础,因为逻辑设计、物理设计以及应用程序的设计都会以此为依据。有效的沟通和合作是非常重要的,分析人员需要了解用户的各项业务并进行分析和加工,将用户眼中的业务转换成为设计人员所需要的信息组织。
6.3.3 概念结构设计
概念结构设计的目标是产生反映系统信息需求的数据库概念结构,即概念模式。概念结构是独立于支持数据库的DBMS和使用的硬件环境的。常用的方法是实体-联系方法(E-R方法),它使用E-R模型将现实世界的信息结构统一由实体、属性和实体之间的联系来描述。概念结构设计的步骤包括选择局部应用、逐一设计E-R图和合并E-R图。
在概念结构设计中,设计人员从用户的角度看待数据以及数据处理的要求和约束,产生一个反映用户观点的概念模式。这个过程涉及对现实事物的分类、聚集和概括,进而确定实体、属性和联系的定义。通过E-R图的设计,可以将需求分析阶段得到的数据进行整理和组织,形成清晰的概念模式。概念结构设计是将用户需求转换为逻辑模式的关键一步。
- 选择局部应用:根据需求分析阶段的数据,将其分为不同的局部应用,并设计对应的数据流图。
- 逐一设计分E-R图:对每个局部应用,根据数据字典和数据流图,设计相应的分E-R图,包括实体、属性、实体标识符和实体间的联系。
- E-R图合并:将各个分E-R图进行合并,解决冲突和消除信息冗余,构建一张统一的全局E-R图。 在合并过程中需要注意处理属性冲突、命名冲突和结构冲突,并进行优化,如合并实体类型和消除冗余属性和联系。
通过以上步骤,可以建立一个精炼的、能够被所有用户共同理解和接受的全局概念模型。
6.3.4 逻辑结构设计
E-R图转换为关系模式:
- 实体转换为关系模式,实体名对应关系模式的名称,属性转换为属性,实体标识符成为关系的主键。
- 一对一联系不需要独立关系模式,归并到其中一个实体,增加另一实体的属性。
- 一对多联系也不需要独立关系模式,归并到多方实体,增加一方实体的属性。
- 多对多联系转换为独立关系模式,属性包括两个多方实体的主键和联系的属性。
关系模式规范化:
- 根据数据依赖确定关系模式的范式(3NF或BCNF)。
- 如果不符合要求,进行分解使其达到范式要求。
- 对关系模式进行评价和修正,可以增加部分冗余属性以提高存储和处理效率。
- 确定完整性约束:
- 基于规范化理论确定关系模式后,添加数据项、表级和表间约束,如检查约束、主码约束、参照完整性约束。
- 确定用户视图:
- 根据数据流图确定处理过程使用的视图,降低应用程序复杂性,提高数据独立性。
- 根据用户类别确定不同用户使用的视图,提高数据安全性。
- 反规范化:
- 对关系模式进行修正,以加速读操作性能。
- 常见的反规范化方法包括冗余列、派生列、表重组和表分割。
- 反规范化会导致数据冗余和设计复杂性,需要采用数据同步方法解决数据不一致性。
6.3.5 物理设计
物理设计的主要工作步骤包括确定数据分布、存储结构和访问方式。
- 在确定数据分布时,需要考虑不同应用分布数据以及根据处理要求确定数据的分布。
- 确定数据的存储结构时,可以采用顺序存储、哈希存储、堆存储和B树存储等方式,并根据数据处理和修改要求确定索引字段和索引类型。
- 确定数据的访问方式则由存储结构所决定,包括存储记录结构设计、存储记录布局和存取方法的设计。
存储记录结构设计需考虑数据项的类型、长度和联系,而存储记录布局则确定数据的存放位置,可采用聚簇功能提高查询效率。存取方法的设计包括存储结构和检索机制,通过建立索引来满足多用户的多种应用要求。然而,需要注意不宜对过小、经常更新、属性值很少、过长、特殊数据类型或不常出现在查询条件中的属性建立索引,以避免影响性能。
6.3.6 数据库实施
根据逻辑和物理设计的结果,在计算机上实现数据库,这个过程包括建立实际的数据库结构、数据加载以及进行试运行和评价。
- 建立实际的数据库结构:
- 使用数据库管理系统(DBMS)提供的数据定义语言(DDL),编写描述逻辑设计和物理设计结果的程序,生成实际的数据库结构。
- 描述数据库模式与子模式,数据库空间等内容。
- 包含数据库完整性描述,确保数据的有效性、正确性和一致性。
- 包含数据库安全性描述,保护数据的安全性和隐私。
- 描述数据库的物理存储参数,如块大小、页面大小、缓冲区大小等。
- 数据加载:
- 设计数据库应用程序,包括数据加载程序。
- 在数据加载前,对数据进行整理和校验,排除不合格数据。
- 数据加载可以通过手工录入或使用数据转换工具进行。
- 数据库试运行和评价:
- 加载部分必要的数据和应用程序后,进行数据库的联合调试和试运行。
- 测试应用程序的功能是否正常。
- 测试数据库的运行效率是否满足设计目标,并符合用户的需求和容忍度。
- 试运行和评价的目的是为了发现问题和改进,并需要非设计人员参与。
- 进行新系统数据库的转储和恢复工作,以避免数据丢失。
6.3.7 数据库运行维护
数据库维护工作包括对数据库性能的监测和改善、故障恢复以及数据库的重组和重构。DBA需要利用系统提供的性能监控和分析工具,经常对数据库运行、存储空间及响应时间进行分析。备份方案应根据应用要求制定不同的备份方案,保证一旦发生故障能够快速将数据库恢复到一致性状态。数据库重组是去除废弃空间和碎片空间中的指针链,使数据库记录在物理上紧连;数据库重构包括表结构和视图的修改,需要评价和验证,保证数据的安全性。
6.4 应用程序与数据库的交互
6.4.1 库函数级别访间接口
数据库提供的库函数级别的数据访问接口,如Oracle Call Interface(OCI),是最底层的高级程序语言访问数据接口。OCI由一组API组成,包含连接数据库、调用SQL和事务控制等函数,通过调用OCI库函数实现对数据库的访问。OCI开发方法将SQL和高级程序语言相结合,具有SQL语言非过程性和C语言过程性的优点,但往往强依赖于特定数据库,需要对该数据库机制有较深的理解,学习难度大,开发效率不高。
6.4.2 嵌入SQL访问接口
嵌入式SQL(Embedded SQL)是一种将SQL语句直接嵌入到高级程序语言源代码中的方法,使得应用程序可以访问和处理数据。宿主语言是指嵌入SQL的目标源码语言,如C、COBOL、Java等。数据库厂商需要提供嵌入式SQL的支持,包括预编译器和函数库,以解决宿主语言编译器无法识别SQL程序、数据传递、查询结果赋值、数据类型转换等问题。嵌入式SQL中除了执行标准SQL程序外,还增加了宿主变量声明、数据库访问、事务控制、游标操作等额外的语法成分。通过嵌入式SQL,应用程序可以更方便地与数据库交互。
6.4.3 通用数据接口标准
开放数据库连接(ODBC)是为解决异构数据库间的数据共享而产生的,它提供了统一的接口,允许应用程序以SQL为标准访问不同的DBMS。ODBC的优点是可以以统一的方式处理所有关系数据库。
在具体操作中,需要先使用ODBC管理器注册一个数据源,然后应用程序通过ODBC与具体数据库建立连接。
为了简化ODBC的操作,微软开发了数据库访问对象(DAO)、远程数据库对象(RDO)、ActiveX数据对象(ADO)等数据库接口。这些接口分别适用于不同的应用场景和数据库类型。ADO.NET是在.NET框架下开发的一组面向对象类库,用于与数据源进行交互。
Java数据库连接(JDBC)是Java语言中用于访问数据库的应用程序接口,提供了查询和更新数据库的方法。JDBC可以为多种关系数据库提供统一访问,它是一种基础接口,可以构建高级接口和工具。
6.4.4 ORM访问接口
对象关系映射(ORM)是一种程序设计技术,用于实现面向对象编程语言中不同类型系统数据之间的转换。ORM通过使用元数据,将程序中的对象与关系数据库相互映射,可以解决数据库与程序间的异构性。
ORM负责实体域对象的持久化,封装数据库访问细节,提供了实现持久化层的另一种模式。采用映射元数据(XML)来描述对象-关系的映射细节,使得ORM中间件能在任何一个应用的业务逻辑层和数据库之间充当桥梁。
在软件开发效率上,ORM的使用降低了程序员数据库知识的要求。在编程过程中,程序员只需考虑对象即可,无需关心数据库中的数据模式及对应的SQL语句。
在Java语言环境中,常见的ORM框架包括Hibernate、Mybatis和JPA等。其中,Hibernate是全自动的框架,强大、复杂、笨重、学习成本较高;Mybatis是半自动的框架;JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,是Java自带的框架。
6.5 NoSQL数据库
6.5.1 分类与特点
本文介绍了当前出现的不同类型、面向不同应用的 NoSQL 数据库,总结了四种主要类型及其特点:列式存储数据库、键值对存储数据库、文档型数据库和图数据库。这些数据库普遍具有易扩展、大数据量、高性能、灵活的数据模型和高可用等特点。虽然业界对 NoSQL 并没有明确的范围和定义,但是这些特点是它们共同的特征,也是其在大数据环境下得以广泛应用的重要原因。
6.5.2 体系框架
总结起来,NoSQL整体框架包括数据持久层、数据分布层、数据逻辑模型层和接口层。其中,数据持久层定义了数据的存储形式,包括基于内存、硬盘、内存和硬盘接口、订制可插拔等形式;数据分布层定义了数据的分布方式,包括CAP支持、多数据中心支持和动态部署支持;数据逻辑模型层定义了数据的逻辑表现形式;接口层提供了方便的数据调用接口,包括Rest、Thrift、Map/Reduce、Get/Put和特定语言API等。
NoSQL数据库适用于数据模型简单、需要灵活性更强的IT系统、对数据库性能要求较高、不需要高度的数据一致性以及在给定key下映射复杂值的环境。虽然每个产品在每一层都可以有多种选择,但这种分层设计提供了灵活性和兼容性。