《数据库系统概论》(王珊第五版)【丰富篇】

news/2025/3/18 17:36:23/文章来源:https://www.cnblogs.com/arioya/p/18779383

第一章 绪论

数据库系统概述

数据库(DB):是长期存储在计算机内、有组织的、可共享的大量数据的集合。它不仅包含数据本身,还包含数据之间的联系,能为各种用户共享,具有较小的冗余度和较高的数据独立性。例如,一个企业的数据库可以存储员工信息、产品信息、销售数据等,这些数据按照一定的结构组织起来,方便不同部门的人员使用。

数据库管理系统(DBMS):处于用户与操作系统之间,是一层数据管理软件。其主要功能有:

数据定义功能:提供数据定义语言(DDL),用户可以使用它来定义数据库的模式、外模式和内模式,以及各种约束条件。例如,使用 CREATE TABLE 语句创建数据表,通过定义列的数据类型、约束等确定表的结构。

数据操纵功能:提供数据操纵语言(DML),用于实现对数据库中数据的查询、插入、删除和修改等操作。如 SELECT 语句用于查询数据,INSERT INTO 语句用于插入新记录。

数据库的运行管理:这是 DBMS 的核心部分,负责数据库的安全性控制、完整性控制、并发控制、事务管理等。比如,通过设置用户权限来保证数据库的安全性,确保只有授权用户才能访问和操作数据库中的数据。

数据库的建立和维护功能:包括数据库初始数据的输入与转换、数据库的转储与恢复、数据库的重组与性能监视等。例如,在数据库出现故障时,利用备份数据进行恢复操作。

数据库系统(DBS):由数据库、数据库管理系统(及其开发工具)、应用系统、数据库管理员(DBA)构成。DBA 负责全面管理和控制数据库系统,包括数据库设计、维护、安全管理等工作。应用系统则是基于数据库开发的各种软件,满足用户的业务需求,如企业资源规划(ERP)系统、客户关系管理(CRM)系统等。

数据模型

概念模型:主要用于数据库设计阶段,是对现实世界的抽象和描述。最常用的概念模型是 E - R 模型(实体 - 联系模型),它用实体、属性、联系来描述现实世界。

实体:是客观存在并可相互区别的事物。例如,在学校管理系统中,学生、教师、课程等都可以看作是实体。

属性:是实体所具有的某一特性。比如,学生实体具有学号、姓名、年龄、性别等属性。

联系:反映实体之间的关联关系。联系可分为一对一(1:1)、一对多(1:n)和多对多(m:n)联系。例如,一个班级有多个学生,这是一对多联系;一个学生可以选修多门课程,一门课程也可以被多个学生选修,这是多对多联系。

逻辑模型和物理模型

逻辑模型:是用户从数据库所看到的数据模型,用于数据库管理系统的实现。常见的逻辑模型有层次模型、网状模型、关系模型等。关系模型是目前应用最广泛的,它用二维表结构来表示实体及实体间的联系。每个二维表称为一个关系,表中的一行称为一个元组,一列称为一个属性。例如,学生信息表可以用关系模型表示,每行记录一个学生的信息,每列对应学生的某个属性。

物理模型:描述数据在存储介质上的组织结构,与具体的硬件和操作系统密切相关。它涉及到数据的存储方式、索引结构、数据的存取路径等。例如,在磁盘上以何种文件格式存储数据,如何建立索引以提高数据查询效率等。

第二章 关系数据库

关系数据结构

关系:一个关系对应一张二维表,它具有以下性质:

列是同质的,即每一列中的分量是同一类型的数据,来自同一个域。例如,学生表中的年龄列,所有数据都是整数类型,表示学生的年龄。

不同的列可出自同一个域,但每一列有不同的列名。比如,学生表中的年龄列和教师表中的年龄列都属于整数域,但列名不同。

列的顺序无所谓,可以任意交换。例如,学生表中先列学号再列姓名,与先列姓名再列学号,对关系本身没有影响。

任意两个元组不能完全相同。这保证了关系中数据的唯一性,就像每个学生的学号是唯一的一样。

行的顺序无所谓,可以任意交换。例如,学生表中不同学生记录的先后顺序不影响数据的含义。

每一个分量必须是不可分的数据项。例如,不能将学生的家庭地址拆分成多个部分放在一个单元格中,必须将地址的各个部分分别作为不同的属性列。

候选码:能唯一标识一个元组的属性或属性组。例如,在学生表中,学号可以唯一标识一个学生,所以学号是候选码;如果没有重名的学生,姓名也可以作为候选码。主码是从候选码中选定的一个,作为关系的唯一标识。通常选择具有唯一性且稳定不变的属性作为主码,比如学号,因为学生姓名可能会更改,而学号一般在学生整个学习生涯中保持不变。

关系模式:关系的描述,一般表示为关系名 (属性 1, 属性 2, …, 属性 n)。例如,学生关系模式可以表示为 Student (Sno, Sname, Sage, Ssex),其中 Student 是关系名,Sno(学号)、Sname(姓名)、Sage(年龄)、Ssex(性别)是属性。

关系操作

关系操作包括查询(选择、投影、连接、除、并、交、差等)和更新(插入、删除、修改)操作。

选择(Selection):从关系中找出满足给定条件的元组。例如,从学生表中找出年龄大于 20 岁的学生记录,SQL 语句为:

SELECT * FROM Student WHERE Sage > 20;

投影(Projection):从关系中选择若干属性列组成新的关系。例如,从学生表中只查询学生的学号和姓名,SQL 语句为:

SELECT Sno, Sname FROM Student;

连接(Join):将两个或多个关系通过共同属性连接成一个新的关系。连接分为等值连接、自然连接、非等值连接、外连接(左外连接、右外连接、全外连接)等。例如,学生表和选课表通过学号进行自然连接,以获取学生的选课信息,SQL 语句为:

SELECT * FROM Student JOIN SC ON Student.Sno = SC.Sno;

并(Union):将两个关系的元组合并成一个新关系,重复的元组只保留一个。例如,有两个学生表 A 和 B,要将它们合并,SQL 语句为:

SELECT * FROM A UNION SELECT * FROM B;

交(Intersection):找出两个关系中共同的元组。例如,找出同时在 A 表和 B 表中的学生记录,SQL 语句为:

SELECT * FROM A INTERSECT SELECT * FROM B;

差(Difference):从一个关系中减去另一个关系中存在的元组。例如,从 A 表中减去 B 表中存在的学生记录,SQL 语句为:

SELECT * FROM A EXCEPT SELECT * FROM B;

关系操作的特点是集合操作方式,即操作的对象和结果都是集合,这与传统的程序设计语言中的操作方式不同。

关系的完整性

实体完整性:主码的取值不能为空且唯一。这是为了确保关系中的每一个元组都能被唯一标识。例如,在学生表中,学号作为主码,不能有学号为空的记录,也不能有重复的学号。在创建表时可以通过 PRIMARY KEY 约束来实现实体完整性,例如:

CREATE TABLE Student (Sno CHAR(9) PRIMARY KEY,Sname VARCHAR(20),Sage INT,Ssex CHAR(2)
);

参照完整性:外码要么取空值,要么取被参照关系中主码的值。外码是一个关系中的属性或属性组,它引用了另一个关系的主码。例如,在选课表 SC 中,Sno(学号)是外码,它引用了学生表 Student 中的主码 Sno。在创建选课表时可以通过 FOREIGN KEY 约束来实现参照完整性,例如:

CREATE TABLE SC (Sno CHAR(9),Cno CHAR(4),Grade DECIMAL(5, 2),PRIMARY KEY (Sno, Cno),FOREIGN KEY (Sno) REFERENCES Student(Sno)
);

用户定义的完整性:用户针对具体的应用环境定义的完整性约束条件。例如,在学生表中,可以定义年龄的取值范围,或者要求学生姓名不能重复等。可以通过 CHECK 约束来实现,例如:

CREATE TABLE Student (Sno CHAR(9) PRIMARY KEY,Sname VARCHAR(20) UNIQUE,Sage INT CHECK (Sage >= 15 AND Sage <= 50),Ssex CHAR(2)
);

第三章 SQL 语言

SQL 概述

SQL 是结构化查询语言,是关系数据库的标准语言,具有数据定义、数据操纵、数据控制等功能。它具有高度非过程化、面向集合的操作方式、语言简洁、易学易用等特点。几乎所有的关系数据库管理系统都支持 SQL,使得不同数据库之间的数据交互和操作变得更加方便。

数据定义

创建表

CREATE TABLE <表名>
( <列名> <数据类型> [列级完整性约束条件][, <列名> <数据类型> [列级完整性约束条件]]…[, <表级完整性约束条件>] );

例如,创建一个学生表 Student:

CREATE TABLE Student (Sno CHAR(9) PRIMARY KEY,Sname VARCHAR(20),Sage INT,Ssex CHAR(2),CHECK (Ssex IN ('男', '女'))
);

这里,Sno 定义为主码,数据类型为 CHAR (9);Sname 为学生姓名,数据类型为 VARCHAR (20);Sage 为年龄,数据类型为 INT;Ssex 为性别,数据类型为 CHAR (2),并通过 CHECK 约束限制其取值只能为 ' 男' 或 ' 女'。

修改表

ALTER TABLE <表名>[ADD [COLUMN] <新列名> <数据类型> [完整性约束]][DROP [COLUMN] <列名> [CASCADE | RESTRICT]][ALTER COLUMN <列名> <数据类型>];

例如,向 Student 表中添加一个新列 Email:

ALTER TABLE Student ADD COLUMN Email VARCHAR(50);

如果要删除 Student 表中的 Sage 列:

ALTER TABLE Student DROP COLUMN Sage RESTRICT;

RESTRICT 表示只有当该列没有被其他对象引用时才能删除,如果有引用则删除失败;CASCADE 表示删除该列时,与之相关的其他对象(如视图、约束等)也一并删除。

如果要修改 Sname 列的数据类型为 VARCHAR (30):

ALTER TABLE Student ALTER COLUMN Sname VARCHAR(30);

删除表

DROP TABLE <表名> [RESTRICT | CASCADE];

例如,删除 Student 表:

DROP TABLE Student RESTRICT;

同样,RESTRICT 表示只有当表中没有相关依赖对象(如视图、触发器等)时才能删除;CASCADE 表示删除表的同时,与之相关的所有依赖对象也一并删除。

3. 数据查询

单表查询

SELECT [ALL | DISTINCT] <目标列表达式>[, <目标列表达式>]…FROM <表名>[WHERE <条件表达式>][GROUP BY <列名1> [HAVING <条件表达式>]][ORDER BY <列名2> [ASC | DESC]];

ALL 表示保留查询结果中的所有行,包括重复行;DISTINCT 表示去除查询结果中的重复行。例如,查询 Student 表中所有学生的姓名和性别,包括重复记录:

SELECT ALL Sname, Ssex FROM Student;

查询 Student 表中不重复的学生姓名:

SELECT DISTINCT Sname FROM Student;

WHERE 子句用于指定查询条件。例如,查询年龄大于 20 岁的女生:

SELECT * FROM Student WHERE Sage > 20 AND Ssex = '女';

GROUP BY 子句用于将查询结果按指定列进行分组。例如,统计每个系的学生人数:

SELECT Sdept, COUNT(*) AS StudentCountFROM StudentGROUP BY Sdept;

HAVING 子句用于对分组后的结果进行筛选。例如,查询学生人数大于 50 的系:

SELECT Sdept, COUNT(*) AS StudentCountFROM StudentGROUP BY SdeptHAVING COUNT(*) > 50;

ORDER BY 子句用于对查询结果按指定列进行排序,ASC 表示升序(默认),DESC 表示降序。例如,按年龄降序查询学生信息:

SELECT * FROM Student ORDER BY Sage DESC;

连接查询

等值连接:在连接条件中使用等于号(=)进行连接。例如,查询学生及其选课信息,学生表 Student 和选课表 SC 通过学号 Sno 进行等值连接:

SELECT Student.Sno, Sname, Cno, GradeFROM Student, SCWHERE Student.Sno = SC.Sno;

自然连接:是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。例如:

SELECT Sno, Sname, Cno, GradeFROM Student NATURAL JOIN SC;

非等值连接:在连接条件中使用除等于号以外的其他比较运算符(如 >, <,>=, <=, <> 等)进行连接。例如,查询成绩在 80 - 90 分之间的学生信息和课程信息:

SELECT Student.Sno, Sname, Course.Cno, GradeFROM Student, Course, SCWHERE Student.Sno = SC.Sno AND Course.Cno = SC.Cno AND Grade BETWEEN 80 AND 90;

外连接:包括左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)、全外连接(FULL OUTER JOIN)。

左外连接:返回左表中的所有行以及右表中满足连接条件的行。例如,查询所有学生及其选课情况,包括没有选课的学生:

SELECT Student.Sno, Sname, SC.Cno, GradeFROM Student LEFT OUTER JOIN SC ON Student.Sno = SC.Sno;

右外连接:返回右表中的所有行以及左表中满足连接条件的行。例如,查询所有课程及其选课学生情况,包括没有学生选的课程:

SELECT Course.Cno, Cname, Student.Sno, SnameFROM Course RIGHT OUTER JOIN Student ON Course.Cno = SC.Cno;

全外连接:返回左表和右表中的所有行,当某行在另一表中没有匹配行时,另一表的列值为空。例如:

SELECT Student.Sno, Sname, Course.Cno, CnameFROM Student FULL OUTER JOIN Course ON Student.Sno = SC.Sno;

嵌套查询:将一个查询块嵌套在另一个查询块的 WHERE 子句或 HAVING 短语的条件中的查询。例如,查询与 ' 张三 ' 在同一个系的学生:

SELECT Sno, Sname, SdeptFROM StudentWHERE Sdept = (SELECT SdeptFROM StudentWHERE Sname = '张三'
);

数据更新

插入数据

INSERT INTO <表名> [(<属性列1>[, <属性列2>…])]VALUES (<常量1>[, <常量2>…]);

例如,向 Student 表中插入一条新记录:

INSERT INTO Student (Sno, Sname, Sage, Ssex)VALUES ('2025001', '李四', 22, '男');

如果插入的是表中所有列的值,也可以省略列名,直接写 VALUES 子句:

INSERT INTO StudentVALUES ('2025002', '王五', 20, '女', NULL);

修改数据

UPDATE <表名>SET <列名>=<表达式>[, <列名>=<表达式>]…[WHERE <条件表达式>];

例如,将学号为'2025001' 的学生年龄改为 23 岁:

UPDATE StudentSET Sage = 23WHERE Sno = '2025001';

若要将所有学生的年龄都增加 1 岁:

UPDATE StudentSET Sage = Sage + 1;

删除数据

DELETE FROM <表名>[WHERE <条件表达式>];

比如,删除学号为 '2025002' 的学生记录:

DELETE FROM StudentWHERE Sno = '2025002';

若要删除所有学生记录(清空表):

DELETE FROM Student;

需要注意的是,这种方式会保留表结构,若要彻底删除表及数据,应使用DROP TABLE语句。

第四章 数据库安全性

数据库安全性概述

数据库安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏。在多用户环境下,确保只有授权用户能够访问和操作数据库中的敏感信息至关重要。例如,银行数据库需要防止客户信息被未授权访问,以免造成客户隐私泄露和经济损失。

数据库安全性控制

用户身份鉴别:这是数据库系统提供的最外层安全保护措施。常用方法有:

口令:用户在登录数据库时输入预先设置的密码,系统验证密码正确性。例如,大多数数据库管理系统要求用户设置一定强度的密码,包含字母、数字、特殊字符等,以提高安全性。

生物特征识别:利用人体生物特征,如指纹、面部识别、虹膜识别等进行身份验证。这种方式安全性较高,但需要相应的硬件设备支持,成本相对较高,常用于对安全性要求极高的场景,如军事数据库系统。

存取控制:包括自主存取控制(DAC)和强制存取控制(MAC)。

自主存取控制(DAC):通过 GRANT 和 REVOKE 语句来实现对不同用户授予或收回不同的权限。用户对不同的数据对象有不同的存取权限,而且用户还可以将自己拥有的权限转授给其他用户。

GRANT <权限>[, <权限>]…ON <对象类型> <对象名>TO <用户>[, <用户>]…[WITH GRANT OPTION];

例如,授予用户user1Student表的查询和插入权限,并允许其将这些权限转授给其他用户:

GRANT SELECT, INSERTON TABLE StudentTO user1WITH GRANT OPTION;
REVOKE <权限>[, <权限>]…ON <对象类型> <对象名>FROM <用户>[, <用户>]… [CASCADE | RESTRICT];

若要收回user1Student表的插入权限:

REVOKE INSERTON TABLE StudentFROM user1;

CASCADE 表示级联收回,即如果user1已经将插入权限转授给了其他用户,这些用户的相应权限也一并收回;RESTRICT 表示若user1已将权限转授给其他用户,则收回操作失败,除非先收回被转授用户的权限。

强制存取控制(MAC):在强制存取控制中,数据库管理系统为每个数据对象和用户分配一个敏感度标记。只有当用户的敏感度标记不低于数据对象的敏感度标记时,用户才能访问该数据对象。敏感度标记分为若干级别,如绝密(Top Secret)、机密(Secret)、秘密(Confidential)、公开(Public)等。MAC 主要用于对数据安全性要求极高的系统,如军事、政府部门的数据库系统,以防止敏感信息的非法泄露。

视图机制:通过定义视图,可以将用户对数据的访问限制在视图所定义的数据范围内,从而对机密数据提供安全保护。例如,对于一个包含员工工资信息的Employee表,只向普通员工定义一个不包含工资列的视图,这样普通员工只能查询到除工资以外的员工信息,无法获取敏感的工资数据。

审计:数据库管理系统将用户对数据库的所有操作记录在审计日志中。通过对审计日志的分析,可以发现潜在的安全隐患和违规操作。例如,当发现某个用户频繁尝试登录失败,可能是有人在进行暴力破解密码的攻击,管理员可以通过审计日志及时察觉并采取相应措施,如锁定该用户账号。

数据加密:将数据库中的数据进行加密存储,只有拥有解密密钥的用户才能访问数据。数据加密可以防止数据在存储和传输过程中被窃取或篡改。例如,使用 SSL/TLS 协议对数据库连接进行加密,确保数据在网络传输中的安全性;对敏感数据字段,如用户密码、身份证号等进行加密存储,提高数据存储的安全性。

第五章 数据库完整性

实体完整性

在 CREATE TABLE 语句中,通过 PRIMARY KEY 定义主码来实现实体完整性。主码的值不能为空且唯一,以确保关系中的每个元组都能被唯一标识。例如:

CREATE TABLE Course (Cno CHAR(4) PRIMARY KEY,Cname VARCHAR(40),Credit INT
);

在上述Course表中,Cno(课程号)被定义为主码,保证了每门课程都有唯一的标识,且课程号不能为空。

2. 参照完整性

在 CREATE TABLE 语句中,通过 FOREIGN KEY 定义外码,并使用 REFERENCES 指定被参照表及主码来实现参照完整性。外码的值要么为空,要么是被参照关系中主码的值。例如:

CREATE TABLE SC (Sno CHAR(9),Cno CHAR(4),Grade DECIMAL(5, 2),PRIMARY KEY (Sno, Cno),FOREIGN KEY (Sno) REFERENCES Student(Sno),FOREIGN KEY (Cno) REFERENCES Course(Cno)
);

SC(选课)表中,Sno(学号)和Cno(课程号)共同构成外码,分别参照Student表的Sno主码和Course表的Cno主码,确保选课记录中的学号和课程号在对应的主表中都存在,维护了数据的一致性。

3. 用户定义的完整性

包括列值非空(NOT NULL)、列值唯一(UNIQUE)、检查列值是否满足一个布尔表达式(CHECK)等约束条件,在 CREATE TABLE 语句中定义。例如:

CREATE TABLE Employee (EmpID INT PRIMARY KEY,EmpName VARCHAR(50) NOT NULL,Email VARCHAR(100) UNIQUE,Salary DECIMAL(10, 2) CHECK (Salary > 0)
);

Employee表中,EmpName列定义为 NOT NULL,保证员工姓名不能为空;Email列定义为 UNIQUE,确保每个员工的邮箱地址唯一;Salary列通过 CHECK 约束保证工资值大于 0,符合实际业务逻辑。

第六章 关系数据理论

函数依赖

设 R (U) 是一个属性集 U 上的关系模式,X 和 Y 是 U 的子集。若对于 R (U) 的任意一个可能的关系 r,r 中不可能存在两个元组在 X 上的属性值相等,而在 Y 上的属性值不等,则称 “X 函数确定 Y” 或 “Y 函数依赖于 X”,记作 X→Y。例如,在学生关系模式 Student (Sno, Sname, Sage, Ssex) 中,学号 Sno 唯一确定学生的姓名 Sname、年龄 Sage 和性别 Ssex,即 Sno→Sname,Sno→Sage,Sno→Ssex。函数依赖是关系模式规范化的基础,通过分析函数依赖可以发现关系模式中存在的数据冗余和操作异常问题。

范式

1NF:每一个分量必须是不可分的数据项。满足 1NF 的关系模式消除了数据项重复和嵌套的情况,使得关系中的数据结构更加规范。例如,若一个关系模式中存在一个属性值为多个电话号码的情况(如 '13800138000,13900139000'),则不满足 1NF,应将其拆分为多个独立的电话号码列。

2NF:若关系模式 R∈1NF,并且每一个非主属性都完全函数依赖于 R 的码,则 R∈2NF。例如,在关系模式 SC (Sno, Cno, Grade, Cname) 中,(Sno, Cno) 是主码,Grade 完全函数依赖于 (Sno, Cno),但 Cname 只依赖于 Cno,不完全依赖于 (Sno, Cno),所以该关系模式不满足 2NF。将其分解为 SC (Sno, Cno, Grade) 和 Course (Cno, Cname) 后,两个关系模式都满足 2NF。

3NF:若关系模式 R∈2NF,并且每一个非主属性都不传递函数依赖于 R 的码,则 R∈3NF。例如,在关系模式 Employee (EmpID, DeptID, DeptName) 中,EmpID 是主码,DeptID 依赖于 EmpID,DeptName 依赖于 DeptID,存在传递依赖 EmpID→DeptID→DeptName,不满足 3NF。将其分解为 Employee (EmpID, DeptID) 和 Department (DeptID, DeptName) 后,两个关系模式都满足 3NF。

BCNF:关系模式 R<U,F>∈1NF,若 X→Y 且 Y⊈X 时 X 必含有码,则 R<U,F>∈BCNF。BCNF 是在 3NF 基础上的进一步规范化,消除了主属性对码的部分和传递依赖。例如,在关系模式 S (Sno, Sname, Sdept, Mname) 中,假设没有重名学生,Sno 和 Sname 都可作为候选码,存在 Sno→Sdept,Sdept→Mname,Sno→Mname,且 Sdept 不包含码,不满足 BCNF。将其分解为 S (Sno, Sname, Sdept) 和 Dept (Sdept, Mname) 后,两个关系模式都满足 BCNF。

模式分解

模式分解的目标是消除数据冗余和操作异常,分解要具有无损连接性和保持函数依赖。无损连接性是指分解后的关系通过自然连接可以恢复到原来的关系;保持函数依赖是指分解后的关系模式中仍然保持原关系模式中的函数依赖关系。例如,将关系模式 R (A, B, C, D),函数依赖集 F = {A→B, C→D},分解为 R1 (A, B) 和 R2 (C, D),这种分解既具有无损连接性(通过自然连接 R1 和 R2 可恢复 R),又保持了函数依赖(R1 中保持 A→B,R2 中保持 C→D)。

第七章 数据库设计

数据库设计概述

数据库设计的任务是根据一个单位的信息需求、处理需求和数据库的支撑环境(包括硬件、操作系统与 DBMS),设计出数据模式和应用程序。信息需求描述了单位所需要存储的数据内容和数据之间的联系;处理需求则明确了对数据进行的各种操作,如查询、插入、更新、删除等。例如,对于一个图书馆管理系统,信息需求包括图书信息、读者信息、借阅信息等,处理需求包括查询图书库存、读者借阅登记、归还图书等操作。合理的数据库设计能够提高数据存储和处理的效率,保证数据的完整性和安全性。

数据库设计步骤

需求分析:通过调查收集用户对数据库的信息需求、处理需求等。常用的调查方法有跟班作业、开调查会、询问、设计调查问卷、查阅记录等。例如,在设计企业销售数据库时,需要与销售部门、财务部门等相关人员沟通,了解他们对客户信息、产品销售信息、财务结算信息等方面的需求,以及日常业务中对这些数据的操作流程,如订单处理、销售统计等。需求分析的结果以需求规格说明书的形式呈现,为后续的设计工作提供依据。

概念结构设计:采用 E - R 模型,设计出反映用户需求的概念模型。这一阶段通过对需求分析得到的信息进行抽象和综合,确定实体、属性以及实体之间的联系。例如,在学校管理系统中,确定学生、教师、课程等实体,以及学生与课程之间的选课联系、教师与课程之间的授课联系等。绘制 E - R 图是概念结构设计的重要成果,它直观地展示了数据库的概念模型,便于与用户沟通和确认。

逻辑结构设计:将概念模型转换为关系模型,并进行优化。具体步骤包括将 E - R 图中的实体、联系转换为关系模式,确定关系模式的属性和主码,以及对关系模式进行规范化处理,消除数据冗余和操作异常。例如,将学生实体转换为 Student 关系模式,将学生与课程的选课联系转换为 SC 关系模式,并根据规范化理论对这些关系模式进行优化,使其满足 3NF 或更高范式。

物理结构设计:为关系数据模型选择合适的存储结构和存取方法。存储结构的选择涉及到数据文件的组织方式,如堆文件、顺序文件、索引文件等;存取方法的选择包括索引的建立、哈希表的使用等。例如,对于经常需要按学号查询学生信息的场景,可以在 Student 表的学号列上建立索引,以提高查询效率。物理结构设计需要考虑数据库的性能、存储空间等因素,根据实际应用场景进行权衡和选择。

数据库实施:建立数据库,编写和调试应用程序,组织数据入库等。在这一阶段,使用数据库管理系统提供的工具创建数据库和表结构,编写应用程序代码实现对数据库的操作功能,如使用 Java、Python 等编程语言结合 JDBC、SQLAlchemy 等数据库连接库编写数据库应用程序。同时,将收集到的数据按照设计好的格式和规则导入到数据库中,确保数据的准确性和完整性。

数据库运行和维护:对数据库进行评价、调整、修改等维护工作。随着业务的发展和数据量的增加,数据库的性能可能会下降,需要对数据库进行优化,如调整索引结构、优化查询语句、进行数据归档等。同时,根据新的业务需求,可能需要对数据库结构和应用程序进行修改和扩展。例如,当企业新增了一种产品类型,需要在产品数据库表中添加相应的属性列,并修改相关的应用程序代码以支持对新属性的操作。

第八章 数据库编程

嵌入式 SQL

将 SQL 语句嵌入到高级语言(如 C、Java 等)程序中,利用高级语言的过程性结构来弥补 SQL 语言在实现复杂应用方面的不足。在嵌入式 SQL 中,需要解决 SQL 语句与主语言之间的通信等问题。例如,在 C 语言程序中嵌入 SQL 语句,需要使用预编译处理程序将嵌入的 SQL 语句转换为主语言能够识别的函数调用形式。主语言通过宿主变量与 SQL 语句进行数据传递,宿主变量在 SQL 语句中用冒号(:)作为前缀来引用。例如:

#include <stdio.h>#include <sqlca.h>EXEC SQL BEGIN DECLARE SECTION;char Sno\[10];char Sname\[20];EXEC SQL END DECLARE SECTION;int main() {EXEC SQL CONNECT TO mydb;EXEC SQL SELECT Sno, Sname INTO :Sno, :Sname FROM Student WHERE Sno = '2025001';printf("学号:%s,姓名:%s\n", Sno, Sname);EXEC SQL DISCONNECT mydb;return 0;
}

在上述代码中,EXEC SQL是嵌入式 SQL 的标识,通过BEGIN DECLARE SECTIONEND DECLARE SECTION声明了宿主变量SnoSname,在SELECT语句中使用这些宿主变量来接收查询结果。

2. 动态 SQL

允许在程序运行过程中根据实际需要动态生成 SQL 语句,提高程序的灵活性。动态 SQL 适用于查询条件或查询结构在编译时无法确定的情况。例如,在一个通用的查询工具中,用户可以在运行时输入不同的查询条件,程序根据用户输入动态生成相应的 SQL 语句。在 Java 中使用 JDBC 实现动态 SQL 时,可以通过PreparedStatement对象来构建动态 SQL 语句。例如:

import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.Scanner;public class DynamicSQLExample {public static void main(String\[] args) {String url = "jdbc:mysql://localhost:3306/mydb";String user = "root";String password = "password";try (Connection conn = DriverManager.getConnection(url, user, password)) {Scanner scanner = new Scanner(System.in);System.out.println("请输入查询条件(如:Sage > 20):");String condition = scanner.nextLine();String sql = "SELECT Sno, Sname FROM Student WHERE " + condition;try (PreparedStatement pstmt = conn.prepareStatement(sql)) {try (ResultSet rs = pstmt.executeQuery()) {while (rs.next()) {String sno = rs.getString("Sno");String sname = rs.getString("Sname");System.out.println("学号:" + sno + ",姓名:" + sname);}}}} catch (Exception e) {e.printStackTrace ();}}
}

在上述代码中,程序根据用户输入的查询条件动态构建 SQL 语句,通过PreparedStatement执行查询并获取结果,避免了 SQL 注入风险。

第九章 关系查询处理和查询优化

关系查询处理步骤

查询分析:对查询语句进行语法分析、语义检查等。语法分析使用语法规则检查查询语句的语法结构是否正确,例如 SQL 语句中的关键字拼写、括号匹配等。语义检查则检查查询语句中涉及的表名、列名是否存在于数据库中,以及数据类型是否匹配等。例如,若查询语句中使用了一个不存在的表名,语义检查会识别出该错误。

查询检查:检查用户权限等。数据库管理系统验证执行查询的用户是否具有对查询涉及的数据对象(如表、视图等)的相应权限。比如,普通用户没有权限查询包含敏感信息的表,若其执行了针对该表的查询语句,系统会在查询检查阶段拒绝执行,并返回权限不足的错误提示。

查询优化:选择一个高效执行的查询处理策略,包括代数优化(基于关系代数等价变换规则)和物理优化(选择合适的存取路径和操作算法)。

代数优化:通过对关系代数表达式进行等价变换来提高查询效率。例如,将选择操作尽量提前执行,因为选择操作可以减少参与后续操作的数据量。如查询语句SELECT * FROM Student WHERE Sage > 20 AND Ssex = '女',先执行Sage > 20Ssex = '女'的选择操作,再对结果进行其他操作,比先进行全表扫描再进行选择更高效。常用的关系代数等价变换规则有交换律(如σF1(σF2(E)) ≡ σF2(σF1(E)))、结合律(如σF1(σF2(E)) ≡ σF1∧F2(E))等。

物理优化:根据数据库的物理存储结构和统计信息,选择合适的存取路径和操作算法。例如,对于一个经常需要按某一列进行范围查询的表,如果该列上有索引,选择使用索引扫描算法比全表扫描算法效率更高。数据库管理系统会维护一些统计信息,如每个表的行数、每个列的不同值的数量等,这些信息有助于选择最优的物理执行计划。

查询执行:根据优化后的策略执行查询。数据库管理系统按照优化后的查询计划,调用相应的存储引擎和操作算法,从数据库中读取数据并进行处理,最终返回查询结果。例如,若优化后的计划是先使用索引扫描某张表,再进行连接操作,数据库管理系统会按照这个顺序依次执行这些操作,将最终结果返回给用户。

查询优化的重要性

查询优化可以极大地提高查询效率,减少系统开销,尤其是在大数据量和复杂查询情况下。在实际应用中,数据库中可能存储了海量的数据,一个未经优化的查询可能需要很长时间才能返回结果,甚至可能导致系统资源耗尽。例如,在一个电商数据库中,查询某段时间内销售额最高的前 100 个商品,如果不进行优化,全表扫描可能需要花费数分钟甚至更长时间;而通过合理的索引设计和查询优化,可能在几秒钟内就能得到结果,这对于提高用户体验和系统性能至关重要。

第十章 数据库恢复技术

事务

事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),即 ACID 特性。

原子性:事务中的所有操作要么全部执行成功,要么全部失败回滚。例如,在银行转账事务中,从账户 A 向账户 B 转账 100 元,涉及从账户 A 扣除 100 元和向账户 B 增加 100 元两个操作,这两个操作必须作为一个整体执行,要么都成功完成转账,要么因为任何原因(如账户余额不足)导致两个操作都回滚,保证资金不会凭空消失或增加。

一致性:事务执行前后,数据库的完整性约束保持不变。例如,在一个订单系统中,订单总金额应该等于所有订单项金额之和,当添加或修改订单项时,事务执行过程中必须保证订单总金额的一致性,不能出现计算错误导致金额不一致的情况。

隔离性:多个事务并发执行时,一个事务的执行不能被其他事务干扰。不同事务之间对数据库的操作是相互隔离的,不会出现一个事务修改了另一个事务未提交的数据等问题。例如,在多用户同时进行购物操作时,每个用户的订单事务相互隔离,不会出现一个用户看到另一个用户未完成订单的中间状态数据。

持久性:一旦事务提交,其对数据库的修改就永久保存下来。即使系统出现故障(如断电、硬件损坏等),已提交事务的结果也不会丢失。例如,在用户完成订单支付并提交事务后,无论系统后续发生什么情况,支付记录都会被持久保存,用户的订单状态也会正确更新。

故障类型

事务内部故障:如运算溢出、违反完整性约束等。例如,在一个计算库存数量的事务中,如果出现除法运算中除数为 0 的情况,就会导致运算溢出,事务无法正常执行;或者在插入一条新的学生记录时,违反了学生表中主码唯一的完整性约束,也属于事务内部故障。事务内部故障通常需要撤销该事务对数据库所做的所有修改,使数据库恢复到事务开始前的状态。

系统故障:如操作系统故障、DBMS 代码错误等。当操作系统出现崩溃、死机等情况,或者数据库管理系统本身的代码存在缺陷导致运行异常时,会引发系统故障。系统故障发生时,正在运行的事务可能部分完成,部分未完成。在系统恢复后,需要对这些事务进行处理,通常是撤销未完成的事务,重做已提交的事务,以保证数据库的一致性。

介质故障:如磁盘损坏等。磁盘作为数据库数据的主要存储介质,若发生物理损坏(如磁盘盘面划伤、磁头损坏等),会导致存储在其上的数据丢失。介质故障是最严重的故障类型,恢复过程通常需要使用数据库备份和日志文件来恢复数据。首先恢复最近的数据库备份,然后根据日志文件重做已提交的事务,使数据库尽可能恢复到故障发生前的状态。

恢复技术

日志文件:用于记录事务对数据库的更新操作,是恢复的重要依据。日志文件中记录了事务的开始、结束以及每个更新操作的详细信息,包括操作的对象(如表、行)、操作类型(如插入、删除、修改)以及操作前后的数据值等。例如,在一个修改学生年龄的事务中,日志文件会记录事务开始时间、修改的学生记录的主键值、修改前的年龄和修改后的年龄等信息。通过日志文件,数据库管理系统可以在故障发生时,准确地知道哪些事务需要撤销,哪些事务需要重做。

恢复策略:针对不同故障类型,采用不同的恢复策略。

事务故障恢复:采用撤销事务操作。当事务内部发生故障时,数据库管理系统通过日志文件反向扫描,将事务对数据库所做的修改逐一撤销,使数据库恢复到事务开始前的状态。例如,在一个插入操作导致违反唯一约束的事务故障中,系统从日志文件中找到该插入操作记录,将其撤销,即删除刚刚插入的记录,从而恢复数据库的一致性。

系统故障恢复:采用撤销未完成事务和重做已提交事务。系统故障发生后,数据库管理系统首先通过日志文件确定在故障发生时哪些事务未完成,哪些事务已提交。对于未完成的事务,进行撤销操作,将其对数据库的修改回滚;对于已提交的事务,进行重做操作,重新执行这些事务对数据库的更新操作,确保这些事务的结果在系统恢复后依然生效。例如,在系统故障前有一个已提交的转账事务,系统恢复时需要重新执行该转账操作,保证资金转移成功;同时,对于一个正在进行但未完成的订单事务,需要撤销其对数据库的部分修改,避免数据不一致。

介质故障恢复:需要重装数据库副本并重做已提交事务。首先,使用最近的数据库备份文件将数据库恢复到备份时刻的状态,这个备份文件可以是全量备份或增量备份。然后,根据日志文件,对从备份时刻到故障发生时刻之间已提交的事务进行重做,使数据库恢复到尽可能接近故障发生前的状态。例如,数据库每周日进行全量备份,周三发生介质故障,恢复时先将周日的全量备份恢复到数据库,然后根据周一到周三的日志文件,重做这期间已提交的所有事务,尽可能恢复丢失的数据。

第十一章 并发控制

并发控制概述

在多用户共享数据库系统中,多个事务可能同时对数据库进行操作,并发控制的目的就是确保这些并发事务正确执行,保证数据库的一致性和完整性。如果没有有效的并发控制机制,并发事务可能会相互干扰,导致数据不一致问题。

并发操作带来的数据不一致性问题

丢失修改:两个事务 T1 和 T2 同时读入同一数据并修改,T2 的提交结果覆盖了 T1 的提交结果,导致 T1 的修改丢失。例如,在机票预订系统中,两个用户同时查询并预订同一航班的剩余机票,若没有并发控制,可能出现一个用户预订成功后,另一个用户也预订成功,但实际剩余机票数量却出现错误的情况。

不可重复读:事务 T1 读取某一数据后,事务 T2 对其进行了修改或删除,当 T1 再次读取该数据时,得到与前一次不同的结果。例如,事务 T1 查询某商品的库存数量为 100,事务 T2 在 T1 查询后将库存数量修改为 80,T1 再次查询时发现库存数量变为 80,这就导致 T1 两次读取结果不一致,产生不可重复读问题。

读 “脏” 数据:事务 T1 修改某一数据,并将其写回磁盘,事务 T2 读取了 T1 修改后的数据,而 T1 由于某种原因撤销了对该数据的修改,将数据恢复到原值,此时 T2 读取到的数据与数据库中的真实数据不一致,T2 读到了 “脏” 数据。例如,在银行转账事务中,T1 从账户 A 向账户 B 转账 100 元,T2 读取了账户 B 的新余额,但随后 T1 转账事务因异常回滚,账户 B 余额应恢复原状,此时 T2 读取到的就是错误的 “脏” 数据。

并发控制技术

封锁

封锁类型

排他锁(X 锁):又称写锁,若事务 T 对数据对象 A 加上 X 锁,则只允许 T 读取和修改 A,其他任何事务都不能再对 A 加任何类型的锁,直到 T 释放 A 上的锁。这保证了在同一时刻只有一个事务能对数据进行修改,避免了并发修改导致的数据不一致。例如,在更新员工工资的事务中,对员工工资表中的相关记录加 X 锁,防止其他事务同时修改该记录。

共享锁(S 锁):又称读锁,若事务 T 对数据对象 A 加上 S 锁,则其他事务只能对 A 加 S 锁,而不能加 X 锁,直到 T 释放 A 上的锁。多个事务可以同时对一个数据对象加 S 锁,从而实现多个事务对数据的并发读取。例如,多个用户同时查询商品信息时,对商品表中的相关记录加 S 锁,允许并发读取。

封锁协议

一级封锁协议:事务 T 在修改数据 R 之前必须先对其加 X 锁,直到事务结束(提交或回滚)才释放。一级封锁协议可以防止丢失修改,但不能解决不可重复读和读 “脏” 数据问题。例如,在机票预订事务中,对机票库存数据加 X 锁,确保在预订过程中不会出现丢失修改情况,但如果其他事务在该事务执行期间修改了相关数据,仍会出现不可重复读问题。

二级封锁协议:在一级封锁协议基础上,事务 T 在读取数据 R 之前必须先对其加 S 锁,读完后即可释放 S 锁。二级封锁协议可以防止丢失修改和读 “脏” 数据,但不能完全解决不可重复读问题。因为在事务 T 读取数据后,其他事务仍可能对数据加 X 锁并修改数据,T 再次读取时结果会不一致。

三级封锁协议:在一级封锁协议基础上,事务 T 在读取数据 R 之前必须先对其加 S 锁,直到事务结束才释放。三级封锁协议可以防止丢失修改、不可重复读和读 “脏” 数据,是最严格的封锁协议。例如,在财务报表生成事务中,对相关财务数据加 S 锁并保持到事务结束,确保在生成报表过程中数据不会被其他事务修改,保证了数据的一致性。

死锁与活锁

死锁:两个或多个事务都处于等待状态,每个事务都在等待其他事务释放锁,导致这些事务都无法继续执行,形成死锁。例如,事务 T1 持有数据 A 的 X 锁,等待获取数据 B 的 X 锁,而事务 T2 持有数据 B 的 X 锁,等待获取数据 A 的 X 锁,此时 T1 和 T2 都无法继续执行,陷入死锁。预防死锁的方法有一次封锁法(事务必须一次性将所有要使用的数据全部加锁)和顺序封锁法(所有事务按照相同顺序对数据进行加锁);检测死锁的方法有超时法和等待图法,当检测到死锁时,通常选择回滚一个或多个事务来解除死锁。

活锁:某个事务由于其他事务不断获取锁而始终无法获得所需锁,从而长时间处于等待状态,这种现象称为活锁。例如,事务 T1 等待数据 A 的 X 锁,而事务 T2、T3 等事务不断获取数据 A 的 S 锁,导致 T1 一直无法获取到 X 锁,产生活锁。可以通过采用先来先服务的调度策略等方法来避免活锁。

并发调度的可串行性:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行执行这些事务时的结果相同,称这种调度策略为可串行化调度。可串行化调度是并发控制的目标,通过合理的并发控制机制,如封锁协议等,确保事务的并发调度是可串行化的,从而保证数据库的一致性。例如,事务 T1 和 T2 并发执行,若最终结果与先执行 T1 再执行 T2 或先执行 T2 再执行 T1 的结果一致,则该并发调度是可串行化的。

两段锁协议:事务分为两个阶段,第一阶段是获得封锁,事务可以获得任何数据项上的任何类型的锁,但不能释放任何锁;第二阶段是释放封锁,事务可以释放任何数据项上的任何类型的锁,但不能再申请任何锁。遵循两段锁协议的事务,其并发调度是可串行化的。例如,在一个复杂的业务事务中,先按照业务需求获取所有需要的锁,在完成所有操作后再一次性释放所有锁,保证了事务的可串行化执行。

章内容,这份笔记已覆盖了教材的大部分核心知识。你可以根据自己的复习进度,着重关注薄弱环节。要是你在回顾过程中,发现某些知识点在实际应用中有疑惑,或者想探讨更深入的技术细节,欢迎随时告诉我 。

第十二章 分布式数据库系统

分布式数据库的特点

数据分布性:数据分布在多个场地的计算机上,通过网络连接。例如,大型跨国公司的数据库,客户数据可能存储在各个地区的服务器上。

逻辑整体性:从用户角度看,分布式数据库如同一个集中式数据库,有统一的模式结构,数据的操作对用户透明。

场地自治性:每个场地的数据库系统都能独立管理本地数据,执行局部应用。如分公司可自主管理本地业务数据。

分布式数据库的体系结构

全局外模式:为用户提供分布式数据库的全局视图,类似于集中式数据库的外模式。

全局概念模式:描述分布式数据库的整体逻辑结构,定义全局数据的逻辑关系。

分片模式:将全局数据划分为若干片段,每个片段可分配到不同场地存储,如水平分片、垂直分片等。

分配模式:确定各个数据片段在哪个场地存储。

局部概念模式:每个场地的局部数据库的概念模式,描述本地存储的数据。

局部内模式:每个场地的局部数据库的物理存储结构。

分布式数据库的查询处理和优化

查询处理需要考虑数据分布情况,涉及到场地间的数据传输。例如,一个查询可能需要从多个场地获取数据并进行整合。

优化目标是减少通信代价和本地处理代价,常用方法包括基于半连接的优化算法、基于直接连接的优化算法等。

第十三章 对象关系数据库系统

对象关系数据库的基本概念

它是在关系数据库基础上,引入面向对象的概念和技术。如支持复杂数据类型(如数组、集合等),用户可自定义数据类型。

具有对象标识(OID),每个对象有唯一标识,类似于关系数据库中的主键。

对象关系数据库的体系结构

扩展了关系数据库的体系结构,增加了对对象数据的管理功能。例如,在 SQL 中增加了处理对象的语法和操作符。

对象关系数据库的 SQL 语言扩展

支持定义和使用复杂数据类型,如CREATE TYPE语句用于创建自定义数据类型。

增加了操作复杂数据类型的函数和操作符,如对数组进行元素访问、集合运算等操作。

第十四章 数据仓库与联机分析处理

数据仓库的基本概念

数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。与操作型数据库不同,它更侧重于数据分析和决策支持。例如,企业将多年的销售数据整合到数据仓库,用于分析销售趋势、产品受欢迎程度等。

数据仓库的数据来源广泛,包括多个操作型数据库和外部数据源。

数据仓库的体系结构

数据源:提供原始数据,如企业的各种业务数据库。

数据抽取、转换和加载(ETL):将数据源中的数据抽取出来,进行清洗、转换(如格式转换、数据整合等),然后加载到数据仓库中。

数据仓库:存储经过处理的结构化数据,通常采用星型模型或雪花模型组织数据。

数据集市:是数据仓库的子集,针对特定的主题或部门,为其提供更聚焦的数据服务。

前端工具:包括联机分析处理(OLAP)工具、数据挖掘工具、报表工具等,用于对数据仓库中的数据进行分析和展现。

联机分析处理(OLAP)

OLAP 是一种数据分析技术,支持复杂的分析操作,如切片、切块、钻取(上卷、下钻)、旋转等。例如,通过切片操作可以从时间、地区、产品等多个维度中选择特定维度的数据进行分析;钻取操作可以从汇总数据深入到明细数据进行查看。

OLAP 的数据组织形式有 ROLAP(基于关系数据库的 OLAP)和 MOLAP(基于多维数据库的 OLAP)等。

第十五章 大数据与云数据库

大数据概述

大数据具有 Volume(大量)、Velocity(高速)、Variety(多样)、Value(价值)、Veracity(真实性)等特点。数据量巨大且增长速度快,数据类型多样,包括结构化、半结构化和非结构化数据。例如,社交媒体平台每天产生海量的文本、图片、视频等多种类型的数据。

大数据管理系统

针对大数据的特点,发展了新的数据库管理系统,如 NoSQL 数据库。NoSQL 数据库包括键值存储数据库(如 Redis)、列族数据库(如 HBase)、文档数据库(如 MongoDB)、图形数据库(如 Neo4j)等,它们在处理不同类型大数据方面各有优势。

大数据管理系统还涉及数据存储、处理和分析的分布式架构,如 Hadoop 生态系统,包括 HDFS(分布式文件系统)用于存储大数据,MapReduce 用于分布式数据处理。

云数据库

云数据库是部署在云计算平台上的数据库服务,用户可以通过网络按需获取数据库资源。具有高可用性、可扩展性、低成本等优势。例如,企业可以根据业务需求动态调整云数据库的存储容量和计算能力,无需大量的前期硬件投资。

云数据库的部署模式有公有云、私有云、混合云等。不同模式在安全性、成本和管理灵活性方面各有特点,企业可根据自身需求选择合适的模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/901026.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

干锅菜单

100001、 100002、 100003、 100004、 100005、 100006、 100007、 100008、本人前端水平有限,写的知识点可能有谬误,欢迎留言指正,如果看到,我将第一时间回复。感谢支持!

汤锅菜单

110001、 110002、 110003、 110004、本人前端水平有限,写的知识点可能有谬误,欢迎留言指正,如果看到,我将第一时间回复。感谢支持!

web153笔记(后端不能单⼀校验,后端校验要严密+过滤php+.user.ini文件包含)

这⼀次再传php就拦截下来了,这⾥开始可以⽤ .user.ini 来构造后⻔php.ini是php的⼀个全局配置⽂件,对整个web服务起作⽤;⽽.user.ini和.htaccess⼀样是⽬录的配置⽂件,.user.ini就是⽤户⾃定义的⼀个php.ini,我们可以利⽤这个⽂件来构造后⻔和隐藏后⻔。.htaccess是Apache…

VISIO-visio2013激活工具亲测有效

如果觉得对您有帮助 还请点赞收藏,谢谢~ 通过网盘分享的文件:激活工具 链接: https://pan.baidu.com/s/1y4FDjp59CoXtcB70_q1slA?pwd=sky1 提取码: sky1

安装ubantu报错VMware Workstation 与 Device/Credential Guard 不兼容

报错问题解决 1、按下WIN+R打开运行,然后输入services.msc回车; 2、在服务中找到 HV主机服务,双击打开设置为禁用3、win+x,然后打开powershell(管理员)运行命令:bcdedit /set hypervisorlaunchtype off 4、重启电脑

如何在 Github 上获得 1000 star?

作为程序员,Github 是第一个绕不开的网站。我们每天都在上面享受着开源带来的便利,我相信很多同学也想自己做一个开源项目,从而获得大家的关注。然而,理想很丰满,现实却是开发了很久的项目仍然无人问津。 最近,我的一个项目获得了超过 1000 star 的成绩,我认为这是一个重…

生活-家电: 论“内卷文化” + 品牌 VS 品质:记一起“知名品牌” 因 “商品设计缺陷”的退货经历

论“内卷文化” 如有不对欢迎指正。 起初,我也不知道"什么是内卷",面对现象级的"内卷文化"兴起, 各地"卷王不断", 实则是"阶层固化", "富贵阶级 压榨 普通民众的"另一"代称"? "富商贵族"多了第一批…

菜鸡的LLM algorithm学习笔记(I)-transformer篇

Transformer 结构分为几个部分embedding,encoder,decoder以及output 1.embedding block作为对于模型输入的处理,首先将模型的输入进行向量化;如输入为“我想要吃一个苹果。”-->X: [[0,0,0,1,2,222,....], [2,2,3,4,5,...], [3,4,5,6,....], []....];接着经过positional…

2025低空经济写入政府工作报告:万亿蓝海如何重塑未来城市?

2025年政府工作报告首次将“低空经济”列为重点发展领域,标志着这一新兴产业正式上升为国家战略。从2021年首次写入《国家综合立体交通网规划纲要》,到2024年定位为“新增长引擎”,再到2025年全国超30个省份将其列入发展规划,低空经济正以“政策+技术+资本”三重驱动,开启…

AI大模型:重塑交通执法的“智慧之眼”

交通执法,曾是城市治理中最依赖人力的领域之一。而随着AI大模型技术的突破,一场“从人力到算力”的变革正在发生:青岛交警的“智法”系统每天自动筛查上万条违法线索,深圳交警的AI预审平台将废片率降低40%,成都的非机动车劝导系统斩获全国技术革新一等奖……这些场景背后,…