diff --git "a/06\344\275\225\347\235\277/.keep" "b/06\344\275\225\347\235\277/.keep" new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git "a/06\344\275\225\347\235\277/\344\275\234\344\270\232/.keep" "b/06\344\275\225\347\235\277/\344\275\234\344\270\232/.keep" new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git "a/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-9-1/.keep" "b/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-9-1/.keep" new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git "a/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-9-1/\351\242\230\347\233\2561.png" "b/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-9-1/\351\242\230\347\233\2561.png" new file mode 100644 index 0000000000000000000000000000000000000000..3aafa133864deb55c56076ebb76ea1967fa50297 Binary files /dev/null and "b/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-9-1/\351\242\230\347\233\2561.png" differ diff --git "a/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-9-1/\351\242\230\347\233\2561\344\275\234\344\270\232.png" "b/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-9-1/\351\242\230\347\233\2561\344\275\234\344\270\232.png" new file mode 100644 index 0000000000000000000000000000000000000000..fcc82ecfc5fdbc1aaddf11d748b1e84b5b26846e Binary files /dev/null and "b/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-9-1/\351\242\230\347\233\2561\344\275\234\344\270\232.png" differ diff --git "a/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-9-1/\351\242\230\347\233\2562.png" "b/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-9-1/\351\242\230\347\233\2562.png" new file mode 100644 index 0000000000000000000000000000000000000000..f2d254efd0d10c78d7b16afcebbe2ee0677963fc Binary files /dev/null and "b/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-9-1/\351\242\230\347\233\2562.png" differ diff --git "a/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-9-1/\351\242\230\347\233\2562\344\275\234\344\270\232.png" "b/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-9-1/\351\242\230\347\233\2562\344\275\234\344\270\232.png" new file mode 100644 index 0000000000000000000000000000000000000000..ef7b22e5d769f5e484490b42871277d470b4d1b7 Binary files /dev/null and "b/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-9-1/\351\242\230\347\233\2562\344\275\234\344\270\232.png" differ diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/.keep" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/.keep" new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/.keep" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/.keep" new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/2022-9-1\347\254\224\350\256\260.md" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/2022-9-1\347\254\224\350\256\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..e0f4273e18063b2682b5054e433772ee9ad8beab --- /dev/null +++ "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/2022-9-1\347\254\224\350\256\260.md" @@ -0,0 +1,355 @@ +# 课程目标 + +1. 学习**E-R图**的绘制,理解数据库范式,掌握如何规范地设计数据库。 + +2. 数据库的高级查询,子查询。 + +3. **创建和使用索引、视图**,实现高效的数据管理。 + +4. 学习使用T-SQL进行**数据库编程**,实现多功能数据管理。 + +5. 编写和使用**存储过程**,在数据库中实现高性能数据管理。 + +6. 编写和使用**触发器**,根据业务规则而,实现复杂的数据完整约束。 + +7. 学习使用**事务**处理,使用**游标**获取查询结果。 + +8. 数据库的各项安全性设置。 + + + + +# 数据库设计 + +## 1.本讲内容 + +- 了解数据库设计的步骤 +- 掌握绘制数据库E-R图的方法 +- 理解数据库的规范化 +- 使用三范式规范数据库的设计 + + +![image-20220831183207750](C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20220831183207750.png) + +![image-20220831183213884](image-20220831183213884.png) + +- 好的设计需要知识和经验 + +- 好的设计既实用又美观 + +- 糟糕的设计或者根本没去设计会导致不希望的结局 + + + +### 信息收集 + +- 应用程序的业务有其针对性,数据库必然存储相关的数据 +- 该阶段的成果从很大程度上决定了将来数据库存储信息的数据结构和容量 +- 明确哪些问题必须关心,哪些问题不用去关心 + +### 建模 + +和面向对象的程序设计一样,在创建数据库之前,也是设计过程的初级阶段,我们需要为后面的主体工作做充分的准备,这些准备包括 + +- 与数据库相关的将来的应用程序的需求分析,主要是信息收集 +- 将这些信息归纳并用图形符号进行标识 + +### E(Entity实体)-R(Relationship关系)图基础 + +#### E-R图绘制步骤 + +![image-20220831183136743](image-20220831183136743.png) + +#### 实体对应关系 + +对应关系也叫影射基数,他指多个实体之间的数量比例关系。 + + + +1个学生 只在一个班级 + +1个班级有多个学生 + +![image-20220831183302254](image-20220831183302254.png) + +在描述关系时增加影射基数 + +![image-20220831183445955](image-20220831183445955.png) + + + +#### E-R图转换为关系模型 + +- 1对1: + - 可以转换为一个独立的关系模式 + - 可以与任意一端对应的关系模式合并,***在任意一方加入对方的主键*(主码)变为其外键(外码),并加入联系本身的属性**。 +- 1对n,n对1: + - 可以转换为一个独立的关系模式 + - 可以与n端对应的关系模式合并**,将1方的主键加入n方作为其外键**,**并将联系的属性也加入n方** +- m对n: + - 可以转换为一个独立的关系模式(新建一张关系表)**,将联系双方的主键(主码)加入其中,并将联系的属性也加入其中。** + +#### 范例: + +![image-20220831183739586](image-20220831183739586.png) + + + +1个用户 可以在 n主贴 发表言论 + +1个主贴 只有1个楼主 + + + +1个主贴有多个跟帖 + +1个跟帖只能在一个主贴下发表 + + + + + +#### 学生系统练习: + +1. 标识实体: + - 学生:代表一个唯一的学生 + - 班级:代表一个班级 +2. 标识属性: + - 学生:编号、姓名、性别,年龄,电话等 + - 班级:编号、名称、班主任、人数 +3. 确定关系: + - 这时候需要细致的分析,做出正确的判断 + - 甚至还需要对该行业的业务逻辑有一定的了解 + + + +最后的完整E-R图就是将来数据库的模型 + +![image-20220831183652683](image-20220831183652683.png) + +**模型转换** + +将数据模型,即E-R图转换为数据库表 + +![image-20220831183712113](image-20220831183712113.png) + +### **数据规范化** + +仅有好的RDBMS并不足以避免数据冗余,必须在数据库的设计中创建好的表结构。 + +Dr E.F.codd 最初定义了规范化的三个级别,范式是具有最小冗余的表结构。这些范式是: + +- 第一范式(1st NF -First Normal Fromate) +- 第二范式(2nd NF-Second Normal Fromate) +- 第三范式(3rd NF- Third Normal Fromate) + + + +#### 第一范式 (1st NF) + +- 第一范式的目标是**确保每列的原子性** +- 如果每列都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式(1NF) + +![image-20220831183557091](image-20220831183557091.png) + + + +#### 第二范式 (2nd NF) + +如果一个关系满足第一范式,并且除了主键以外的其他列都依赖于该主键,则满足第二范式(2NF) + +![image-20220831183532105](image-20220831183532105.png) + +#### 第三范式 (3rd NF) + +如果一个关系满足第二范式,并且除了主键以外的其他列都依赖,且直接于主键列,则满足第三范式(3NF) + +订单表(n):订单编号,订购日期,顾客编号 + +顾客表(1):顾客编号,顾客姓名 + +1-->1 + +1--n + +![image-20220831183622900](image-20220831183622900.png) + +**练习** + +1.有如下表结构设计: + +```sql +create table Student --学生表 +( + StuId varchar(20) primary key,--学号 + StuName varchar(20) not null,--学生姓名 + StuContact varchar(50) not null, --联系方式 +) +insert into Student(StuId,StuName,StuContact) +values('001','刘备','QQ:185699887;Tel:13885874587') +select * from Student +``` + +2.有如下表结构设计: + +![image-20220901092024344](C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20220901092024344.png) + +学生:stuno, stuName + +课程:courseno, courseName + +成绩表:score, 学生号,课程号(联合主键) + + + + + +```sql +--选课成绩表 +create table StudentCourse +( + StuId varchar(20),--学号 + StuName varchar(20) not null,--学生姓名 + CourseId varchar(20) not null,--课程编号 + CourseName varchar(20) not null, --选课课程名称 + CourseScore int not null, --考试成绩 +) +insert into StudentCourse(StuId,StuName,CourseId,CourseName,CourseScore) +values('001','刘备','001','语文',80) +insert into StudentCourse(StuId,StuName,CourseId,CourseName,CourseScore) +values('001','刘备','002','数学',70) +insert into StudentCourse(StuId,StuName,CourseId,CourseName,CourseScore) +values('002','关羽','003','英语',80) +insert into StudentCourse(StuId,StuName,CourseId,CourseName,CourseScore) +values('003','张飞','003','英语',90) + +``` + +3.有如下表结构设计: + +```sql +create table Student +( + StuId varchar(20) primary key,--学号 + StuName varchar(20) not null,--学生姓名 + ProfessionalId int not null,--专业编号 + ProfessionalName varchar(50),--专业名称 + ProfessionalRemark varchar(200), --专业介绍 +) +insert into Student(StuId,StuName,ProfessionalId,ProfessionalName,ProfessionalRemark) +values('001','刘备',1,'计算机','最牛的专业') +insert into Student(StuId,StuName,ProfessionalId,ProfessionalName,ProfessionalRemark) +values('002','关羽',2,'工商管理','管理学的基础专业') +insert into Student(StuId,StuName,ProfessionalId,ProfessionalName,ProfessionalRemark) +values('003','张飞',1,'计算机','最牛的专业') +select * from Student +``` + + + + + + + + + + + +#### 规范化实例 + +假设某建筑公司要设计一个数据库。公司的业务规则概括说明如下: + +- 公司承担多个工程项目,每一项工程有:工程号、工程名称、施工人员等 +- 公司有多名职工,每一名职工有:职工号、姓名、性别、职务(工程师、技术员)等 +- 公司按照工时和小时工资率支付工资,小时工资率由职工的职务决定(例如,技术员的小时工资率与工程师不同) +- 公司定期制定一个工资报表,如下图所示 + +![image-20220831183818803](image-20220831183818803.png) + +![image-20220831183837624](image-20220831183837624.png) + +1. 表中包含大量的冗余,可能会导致数据异常: + + - 更新异常 + + 例如,修改职工号=1001的职务,则必须修改所有职工号=1001的行 + + - 添加异常 + + 若要增加一个新的职工时,首先必须给这名职工分配一个工程。或者为了添加一名新职工的数据,先给这名职工分配一个虚拟的工程。(因为主关键字不能为空) + + - 删除异常 + + 例如,1001号职工要辞职,则必须删除所有职工号=1001的数据行。这样的删除操作,很可能丢失了其它有用的数据。 + + + +2. 采用这种方法设计表的结构,虽然很容易产生工资报表,但是每当一名职工分配一个工程时,都要重复输入大量的数据。这种重复的输入操作,很可能导致数据的不一致性。 + + + +**规范化实例-1NF** + +一张表描述了多件事情,如图-3所示。 + +![image-20220831183902104](image-20220831183902104.png) + +**规范化实例-2NF** + +![image-20220831183921784](image-20220831183921784.png) + +**规范化实例-3NF** + +![image-20220831183941544](image-20220831183941544.png) + + + + + + + + + + + + + +一定要使用三范式吗? + +例如:查询编号1001的员工的姓名和8月份工资总额 + + + + + +### 习题 + +1. 数据库E-R图设计(cdm,pdm):某教学管理系统涉及教员、学生、课程、教室四个实体,他们分别具有下列属性: + + 教师:教室号, 姓名,年龄,职称 学生:学号、姓名、年龄、性别 + + 课程:课程号、课程名、课时数 教室:教室编号、地址 + + 这些实体间的联系如下:一个教师可讲授多门课程,一个课程只能被一个教师讲授:一个学生选修多门课程,每门课程有多个学生选修,学生学习有成绩,一门课只在一个教室上,一个教室可上多门课。 + + 请画出教员,学生,课程,教室的E-R图 + +2.**业务需求说明:** +模拟银行业务,设计简易版的银行数据库表结构,要求可以完成以下基本功能需求: +1.银行开户(注册个人信息)及开卡(办理银行卡)(一个人可以办理多张银行卡,但是最多只能办理3张) +2.存钱 +3.查询余额 +4.取钱 +5.转账 +6.查看交易记录 +7.账户挂失 +8.账户注销 + +**表设计:** + +1.账户信息表:存储个人信息。 +2.银行卡表:存储银行卡信息。 +3.交易信息表(存储存钱和取钱的记录) +4.转账信息表(存储转账信息记录) +5.状态信息变化表(存储银行卡状态变化的记录,状态有1:正常,2:挂失,3:冻结,4:注销) + diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/.keep" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/.keep" new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183136743.png" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183136743.png" new file mode 100644 index 0000000000000000000000000000000000000000..12b3155e437debbe03bc490fa3f4370e40d058d4 Binary files /dev/null and "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183136743.png" differ diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183213884.png" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183213884.png" new file mode 100644 index 0000000000000000000000000000000000000000..39c0b856fb19cf2182fc57b46151c683feeb78fb Binary files /dev/null and "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183213884.png" differ diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183302254.png" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183302254.png" new file mode 100644 index 0000000000000000000000000000000000000000..c24692f9ec6ec3ee51e2806df03e5b61f73fe64e Binary files /dev/null and "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183302254.png" differ diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183445955.png" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183445955.png" new file mode 100644 index 0000000000000000000000000000000000000000..af5e54c4599048b074ad48cdc4bd05b0349e20a3 Binary files /dev/null and "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183445955.png" differ diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183532105.png" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183532105.png" new file mode 100644 index 0000000000000000000000000000000000000000..e35d9e11907bd1e5225dd97cb61cef53646d1228 Binary files /dev/null and "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183532105.png" differ diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183557091.png" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183557091.png" new file mode 100644 index 0000000000000000000000000000000000000000..0bc6131ec6d69216b9fb523e4e20a984c284d0a5 Binary files /dev/null and "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183557091.png" differ diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183622900.png" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183622900.png" new file mode 100644 index 0000000000000000000000000000000000000000..8076415c4f0e95ef1dd8eaa994e6564495957ce0 Binary files /dev/null and "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183622900.png" differ diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183652683.png" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183652683.png" new file mode 100644 index 0000000000000000000000000000000000000000..416e2ac44729e6897a8124ceb22aed8195148288 Binary files /dev/null and "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183652683.png" differ diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183712113.png" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183712113.png" new file mode 100644 index 0000000000000000000000000000000000000000..83c6e33f5f4bc4f7ba3a5f12ecd400f612fcf208 Binary files /dev/null and "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183712113.png" differ diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183739586.png" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183739586.png" new file mode 100644 index 0000000000000000000000000000000000000000..5d89b76f3fb8f01d4e2ee0f6fa1180a64da671ba Binary files /dev/null and "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183739586.png" differ diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183818803.png" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183818803.png" new file mode 100644 index 0000000000000000000000000000000000000000..b93d9534c92159f2ff9d91246be169f246a4a585 Binary files /dev/null and "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183818803.png" differ diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183837624.png" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183837624.png" new file mode 100644 index 0000000000000000000000000000000000000000..a96a4812d19772b2899f3a4905f657db4ca3331f Binary files /dev/null and "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183837624.png" differ diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183902104.png" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183902104.png" new file mode 100644 index 0000000000000000000000000000000000000000..0bc8a5a5c6d86fb2b41ea9d7ca2315fadf87fcb4 Binary files /dev/null and "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183902104.png" differ diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183921784.png" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183921784.png" new file mode 100644 index 0000000000000000000000000000000000000000..a8d82e4badea984ce9b1dc098b8b9f941d35bcd1 Binary files /dev/null and "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183921784.png" differ diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183941544.png" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183941544.png" new file mode 100644 index 0000000000000000000000000000000000000000..474afb7cd4fcb97f78b38ab70674f69ea716d2ad Binary files /dev/null and "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-9-1/\345\233\276\347\211\207/image-20220831183941544.png" differ