数据库管理系统 (DBMS) 简介
数据库管理系统 (DBMS) 是现代软件应用程序的重要组成部分,是有效管理、存储和检索数据的组成部分。它们提供了处理数据库的系统方法,确保数据的一致性、可靠性和安全性。本文涵盖了 DBMS 的基本概念、组件和功能,包括数据抽象、模式、数据库语言、事务管理、体系结构和关键数据库元素。
DBMS 的目的
DBMS 的主要目的是提供可靠、高效且用户友好的系统来存储和检索数据。它充当用户与其交互的数据之间的中介,确保隐藏数据存储的复杂性,同时提供强大的数据管理功能。
DBMS 的主要目标包括:
-
高效的数据存储和检索:利用复杂的数据结构来优化数据操作。
-
数据一致性和完整性: 执行规则以维护数据正确性。
-
数据安全:限制对敏感数据的未经授权的访问。
-
并发控制:确保多个用户可以同时访问数据而不会发生冲突。
数据抽象
数据抽象通过隐藏数据存储的复杂性来简化用户与数据库的交互方式。分为三个级别:
1. 物理层面
-
最低抽象级别,描述数据如何物理存储在系统中。
- 专注于低级细节,例如数据块、文件结构和存储路径。
- 通常由数据库管理员和系统开发人员管理。
2. 逻辑层面
- 描述存储哪些数据以及它们之间的关系。
- 使用表、列和关系提供整个数据库的结构化视图。
- 促进物理数据独立性,允许在物理层面进行更改而不影响逻辑结构。
3. 视图级别
-
最高抽象级别,为不同用户提供量身定制的数据库视角。
- 专注于通过隐藏不必要的复杂性来简化最终用户的交互。
- 数据库可能有多个视图来满足特定用户的需求。
实例和模式
数据库是根据其架构和实例来定义的。
-
架构:
- 数据库的逻辑结构,定义表、关系和约束。
- 充当蓝图,除非明确修改,否则随着时间的推移保持不变。
-
实例:
- 特定时刻存储在数据库中的数据内容。
- 随着数据的插入、更新或删除而不断变化。
数据库语言
DBMS 使用专门的语言与数据库交互。这些大致分为:
1. 数据定义语言(DDL)
- 定义数据库结构和模式。
- 操作示例:
-
创建:定义新表或数据库。
-
更改:修改现有结构。
-
DROP:删除表或数据库。
-
DDL中的完整性约束确保数据的准确性和一致性:
-
域约束: 定义属性的允许值。
-
引用完整性: 强制表之间的有效关系。
2. 数据操作语言(DML)
- 使用户能够操作数据库中存储的数据。
- 常用操作:
-
选择:检索数据。
-
插入:添加新数据。
-
删除:删除现有数据。
-
更新:修改现有数据。
- SQL 提供了在关系数据库中广泛使用的标准化 DML 语法。
交易管理
事务是数据库操作的逻辑单元,必须遵守ACID属性以确保可靠性:
-
原子性:交易是不可分割的;要么所有操作成功,要么全部失败。
-
一致性:事务必须使数据库处于有效状态。
-
隔离:并发事务不应互相干扰。
-
持久性:一旦提交,即使系统出现故障,更改也会持续存在。
DBMS 采用锁定、日志记录和并发控制等机制来管理事务并确保这些属性。
数据库和应用程序架构
现代数据库遵循三层架构来分离关注点并增强可扩展性:
-
演示层:
- 面向用户的层,通常是前端应用程序。
- 通过图形界面或网页与用户交互。
-
应用层:
- 实现业务规则和应用程序逻辑的逻辑层。
- 连接前端与数据库。
-
数据库层:
- 存储和管理数据的后端。
- 包括 DBMS 和物理存储系统。
数据库用户和管理员
用户类型:
-
最终用户:使用应用程序或查询与数据库交互。
-
应用程序程序员:使用 DBMS 提供的 API 开发软件应用程序。
-
数据库管理员 (DBA): 管理数据库、控制访问并确保最佳性能。
DBA 的角色:
- 定义和维护模式。
- 实施安全措施。
- 监控和优化数据库性能。
- 执行备份和恢复操作。
表格及其组件
表是关系数据库的基本结构,由行和列组成。
-
行(元组): 代表表中的各个记录。
-
列(属性): 表示具有特定数据类型的数据字段。
-
主键:唯一标识表中的每一行。
-
外键:通过引用其他表中的主键来创建表之间的关系。
数据库中的键
密钥对于确保数据完整性和建立关系至关重要。常见类型包括:
-
主键:表行的唯一标识符。不能包含 NULL 值。
-
外键:引用另一个表中的主键,强制引用完整性。
-
候选键:可以唯一标识一行的任何列或列集。选择一个候选键作为主键。
-
复合键: 由两个或多个属性组成的主键。
-
唯一键:与主键类似,但允许一个 NULL 值。
-
超级键:唯一标识行的候选键的超集。
DBMS 中的函数、过程和触发器
除了管理和查询数据之外,现代 DBMS 还通过 函数、过程和触发器提供封装逻辑和自动化任务的机制。这些元素提高了数据库系统的效率、可维护性和响应能力。
功能
函数是执行特定任务并返回单个值的数据库对象。函数通常用于计算、数据转换或检索特定信息。它们类似于数学函数,可以直接在 SQL 查询中调用。
功能特点:
-
输入参数:函数可以接受零个或多个输入参数。
-
返回值:函数始终返回指定数据类型的单个值。
-
只读:函数不能直接修改数据库表或数据;它们仅限于只读操作。
创建函数的语法(SQL 示例):
CREATE FUNCTION function_name (parameter_list)
RETURNS return_type
AS
BEGIN
-- Function logic
RETURN value;
END;
登录后复制
登录后复制
登录后复制
例子:
根据数量和单位价格计算订单总价的函数:
CREATE FUNCTION calculate_total_price(quantity INT, price_per_unit DECIMAL)
RETURNS DECIMAL
AS
BEGIN
RETURN quantity * price_per_unit;
END;
登录后复制
登录后复制
登录后复制
优点:
- 跨查询的逻辑可重用性。
- 提高了查询的可读性和可维护性。
- 通过封装复杂逻辑来增强性能。
程序
过程是数据库中执行一系列操作的存储程序。与函数不同,过程不返回值,但可以执行数据修改任务,例如 INSERT、UPDATE 和 DELETE。
程序特点:
- 可以有输入、输出和输入输出参数。
- 能够修改数据库表。
- 使用 CALL 或 EXEC 语句执行。
创建过程的语法(SQL 示例):
CREATE PROCEDURE procedure_name (parameter_list)
AS
BEGIN
-- Procedure logic
END;
登录后复制
登录后复制
例子:
更新员工工资的程序:
CREATE PROCEDURE update_salary(employee_id INT, new_salary DECIMAL)
AS
BEGIN
UPDATE employees
SET salary = new_salary
WHERE id = employee_id;
END;
登录后复制
登录后复制
优点:
- 将复杂逻辑封装成可重用的单元。
- 能够在一次调用中执行多个操作。
- 通过减少网络开销提高数据库性能。
触发器
触发器是一个数据库对象,它自动执行预定义的操作以响应表上的特定事件,例如 INSERT、UPDATE 或 DELETE 操作。
触发器的特点:
- 在特定表上定义并由事件激活。
- 可以在事件发生之前或之后触发。
- 用于执行业务规则、维护审核日志或传播更改。
触发器类型:
-
BEFORE 触发器: 在指定事件之前执行。
-
AFTER 触发器: 在指定事件后执行。
-
INSTEAD OF 触发器: 代替事件执行(常用于视图)。
创建触发器的语法(SQL 示例):
CREATE FUNCTION function_name (parameter_list)
RETURNS return_type
AS
BEGIN
-- Function logic
RETURN value;
END;
登录后复制
登录后复制
登录后复制
例子:
记录添加到员工表中的每个新员工的触发器:
CREATE FUNCTION calculate_total_price(quantity INT, price_per_unit DECIMAL)
RETURNS DECIMAL
AS
BEGIN
RETURN quantity * price_per_unit;
END;
登录后复制
登录后复制
登录后复制
优点:
- 自动执行规则和政策。
- 减少重复性任务的人工干预。
- 通过维护更改日志来增强可审核性。
函数、过程、触发器:主要区别
功能 |
函数 |
程序 |
触发器 |
标题>
Feature |
Function |
Procedure |
Trigger |
Returns Value |
Yes |
No |
No |
Modifies Data |
No |
Yes |
Yes |
Execution |
Invoked explicitly |
Invoked explicitly |
Invoked automatically |
Use Case |
Data computation |
Complex operations |
Event-driven actions |
返回值 |
是 |
否 |
否 |
修改数据 |
否 |
是 |
是 |
执行 |
显式调用 |
显式调用 |
自动调用 |
用例 |
数据计算 |
复杂操作 |
事件驱动的操作 |
表>
通过有效地使用函数、过程和触发器,您可以封装业务逻辑、执行规则并在数据库中自动执行任务。这些工具构成了现代 DBMS 应用程序的支柱,使开发人员和管理员能够创建强大且可维护的系统。
在 DBMS 中映射基数
映射基数,也称为基数比,定义一个实体集中可以通过关系集与另一实体集中的实体关联的实体数量。这些基数在描述二元关系集时特别重要,对于多实体关系也很有用。
对于实体集A和B之间的二元关系集R,可能的映射基数如下:
1. 一对一(1:1)
-
定义: A 中的一个实体最多与 B 中的一个实体关联,反之亦然。
-
示例:
- 在员工被分配到停车位的数据库中:
- 每位员工最多分配一个停车位。
- 每个停车位最多分配给一名员工。
-
图表表示:
- A 中的每个实体映射到 B 中的单个实体,B 中的每个实体映射到 A 中的单个实体。
2. 一对多(1:N)
-
定义: A 中的实体可以与 B 中的零个或多个实体关联,但 B 中的实体最多与 A 中的一个实体关联。
-
示例:
- 在作者和书籍数据库中:
- 一个作者可以写多本书。
- 每本书仅由一位作者撰写。
-
图表表示:
- A 中的实体映射到 B 中的多个实体,但 B 中的实体映射到 A 中的单个实体。
3. 多对一(M:1)
-
定义: A 中的实体最多与 B 中的一个实体关联,但 B 中的实体可以与 A 中的零个或多个实体关联。
-
示例:
- 在学生和课程的数据库中:
- 每个学生只能报读一个系。
- 一个院系可以招收多名学生。
-
图表表示:
- A 中的实体映射到 B 中的单个实体,而 B 中的实体可以映射到 A 中的多个实体。
4. 多对多(M:N)
-
定义: A 中的实体可以与 B 中的零个或多个实体关联,反之亦然。
-
示例:
- 在学生和课程的数据库中:
- 一个学生可以报名多门课程。
- 一门课程可以有多名学生注册。
-
图表表示:
- A 中的多个实体映射到 B 中的多个实体,反之亦然。
映射基数的视觉表示
一对一(1:1):
CREATE FUNCTION function_name (parameter_list)
RETURNS return_type
AS
BEGIN
-- Function logic
RETURN value;
END;
登录后复制
登录后复制
登录后复制
一对多 (1:N):
CREATE FUNCTION calculate_total_price(quantity INT, price_per_unit DECIMAL)
RETURNS DECIMAL
AS
BEGIN
RETURN quantity * price_per_unit;
END;
登录后复制
登录后复制
登录后复制
多对一 (M:1):
CREATE PROCEDURE procedure_name (parameter_list)
AS
BEGIN
-- Procedure logic
END;
登录后复制
登录后复制
多对多 (M:N):
CREATE PROCEDURE update_salary(employee_id INT, new_salary DECIMAL)
AS
BEGIN
UPDATE employees
SET salary = new_salary
WHERE id = employee_id;
END;
登录后复制
登录后复制
映射基数的重要性
-
数据库设计:映射基数通过定义实体集之间的清晰关系来帮助设计高效的关系模式。
-
数据完整性:确保关系符合现实世界的约束。
-
查询优化:了解基数有助于优化查询以获得更好的性能。
-
E-R 模型: 在实体关系图中发挥至关重要的作用,使关系变得明确。
映射基数是理解实体在数据库中如何相互关联的基础,并为定义健壮且可扩展的数据库模式提供结构基础。
以上是数据库管理系统简介的详细内容。更多信息请关注PHP中文网其他相关文章!