数据模型:理解数据的组织方式
静态特性:数据结构
- 数据结构:定义了数据的组织形式。例如,在图书馆管理系统中,书籍信息可以组织为一个表格,每本书是一个记录,包含书名、作者、出版年份等字段。
动态特性:数据操作
- 数据操作:包括对数据的增加、删除、更新和查询。例如,图书馆管理系统允许管理员添加新书的记录,删除旧书的记录,更新书籍的可借状态。
逻辑模型
- 层次模型:适用于有明确上下级关系的数据,如公司的组织结构。
- 网状模型:允许更复杂的关系,如社交网络中的朋友关系。
- 关系模型:使用表格形式存储数据,如学生的成绩表,每行代表一个学生,每列代表一门课程。
- 面向对象模型:将数据和操作封装在对象中,如一个
Person
类可以有name
和age
属性,以及speak
方法。 - 对象关系模型:结合了面向对象和关系模型的特点,如PostgreSQL数据库支持存储JSON数据。
- 半结构化数据模型:如NoSQL数据库MongoDB,可以存储JSON格式的数据,允许灵活的数据结构。
数据库系统核心:数据模型的运用
- 表:数据库中的基本存储单位,由多条记录组成。如图书馆管理系统中的
Books
表,每行代表一本书。 - 属性:表中的列,每个属性有特定的数据类型。如
Books
表中的Title
、Author
、PublicationYear
等列。 - 完整性约束:确保数据的准确性和一致性。如
Books
表的ISBN
列设置为唯一,确保每本书的ISBN号不会重复。 - 数据独立性:逻辑独立性允许更改数据库模式而不影响应用程序,物理独立性允许更改存储方式而不影响数据库模式。如更改
Books
表的物理存储方式,如从磁盘存储改为SSD,而不需要修改应用程序代码。
数据操作与控制:SQL语言的力量
SQL基础
- 数据定义语言DDL:定义数据库结构,如创建新表或修改现有表结构。使用
CREATE TABLE
创建新表,使用ALTER TABLE
修改表结构。- 例子:创建一个新表的SQL语句:
-
CREATE TABLE Employees ( EmployeeID INT PRIMARY KEY, FirstName VARCHAR(50), LastName VARCHAR(50), Position VARCHAR(100) );
- 数据操纵语言DML:操作数据库中的数据,如查询、插入、更新和删除记录。使用
SELECT
查询数据,使用INSERT INTO
添加数据,使用UPDATE
更新数据,使用DELETE
删除数据。- 例子:查询所有员工的姓名和职位:
-
SELECT FirstName, LastName, Position FROM Employees;
- 数据控制语言DCL:定义数据库的安全策略,如用户权限的授予和撤销。使用
GRANT
授予用户权限,使用REVOKE
撤销权限。- 授予用户对
Employees
表的查询权限: -
GRANT SELECT ON Employees TO user_name;
- 授予用户对
高级SQL操作
- 视图:基于查询的虚拟表,简化用户操作。
CREATE VIEW
可以创建一个视图,如CREATE VIEW AvailableBooks AS SELECT * FROM Books WHERE Status = 'Available';
,显示所有可借阅的书籍。- 索引:优化查询性能的数据结构。
CREATE INDEX
可以为表的某个列创建索引,提高查询效率。- 触发器:自动执行的数据库过程,响应特定事件。
- 可以自动执行,如在
Books
表上创建一个触发器,每当有新书添加时自动更新库存数量。
数据安全性和完整性:保护数据的防线
- 主码:唯一标识表中每条记录的属性集合。如
Books
表的ISBN
列,唯一标识每本书。 - 用户定义的完整性:通过
CHECK
、NOT NULL
、UNIQUE
等约束实现。如通过约束如CHECK (PublicationYear > 1800)
确保出版年份在合理范围内。 - 完整性控制:通过各种约束和触发器确保数据的正确性和一致性。
数据库设计:从概念到实现
E-R模型
- 概念模型:使用E-R图来表示图书馆管理系统中的实体如书籍、作者、借阅者,以及它们之间的关系。
设计步骤
- 需求分析:确定图书馆管理系统需要哪些功能,如借阅、归还、查询等。
- 概念结构设计:绘制E-R图,表示书籍、作者、借阅者等实体及其关系。
- 逻辑结构设计:将E-R图转换为关系模型,创建相应的表和关系。
- 物理结构设计:考虑如何存储数据,是否需要索引,选择合适的存储引擎。
- 数据库实施:在数据库系统中实现设计,创建表,加载数据。
- 运行和维护:确保数据库正常运行,定期备份,优化性能。
知识点深入:关系模型的规范化
- 1NF:确保数据库表的每一列都是不可分割的基本数据项,如
Books
表中的Title
列不能包含多个标题。 - 2NF:在1NF的基础上,消除部分依赖,如
Orders
表中的OrderID
应该是主键,而不是OrderID
的一部分。 - 3NF:在2NF的基础上,消除传递依赖,如
Customer
表中的Address
不应该依赖于CustomerID
之外的其他列。 - BCNF:在3NF的基础上,进一步规范化,确保每个决定因素都是候选键。