From 89a5cb85e77115d56f5fce2488643c0e56b85817 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A9=B9=E6=BA=90=E9=93=A0?= <1905540517@qq.com> Date: Sun, 4 Sep 2022 21:05:34 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "9.1\347\254\224\350\256\260.md" | 167 +++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 "9.1\347\254\224\350\256\260.md" diff --git "a/9.1\347\254\224\350\256\260.md" "b/9.1\347\254\224\350\256\260.md" new file mode 100644 index 0000000..d0a4ef8 --- /dev/null +++ "b/9.1\347\254\224\350\256\260.md" @@ -0,0 +1,167 @@ +``` +# 一、数据库设计 + +## (一)什么是数据库设计? + +规划和结构化数据库中的数据对象及这些数据之间关系的过程 + +### 1.良好的数据库设计 + +- 节省数据的存储空间 +- 能够保证数据的完整性 +- 方便进行数据库应用系统的开发 + +### 2.糟糕的数据库设计 + +- 数据冗余、存储空间浪费 +- 内存空间浪费 +- 数据更新和插入异常 + +### 3.查看数据库关系图 + +双击目标数据库展开->数据库关系图->新建数据库关系图->添加表 + +******** + +## (二)数据库设计步骤 + +分为6个阶段: + +1. 需求分析阶段:分析客户的业务和数据处理需求 +2. 概要设计阶段:设计数据库的E-R模型图,确认需求信息的正确和完整性 +3. 详细设计阶段:应用三大范式审核数据库结构 +4. 代码编写阶段:物理实现数据库,编码实现应用 +5. 软件测试阶段 +6. 安装部署 + +***** + +### 1.需求分析 + +1. 收集信息 + + 与该系统有关人员进行交流、座谈,充分了解用户需求,理解数据库需要完成的任务 + +2. 标识实体 + + 标识数据库要管理的关键对象或实体,实体一般是名词 + +3. 标识每个实体的属性 + + 就是字段或者列 + +4. 标识实体之间的关系 + +******* + +### 2.概要设计 + +#### 2.1绘制E-R图 + +- 正方形:实体,一般是名词 +- 椭圆形:属性,一般是名词 +- 菱形:关系,一般是动词 + +******* + +#### ==2.2实体—关系== + +- **实体**:凡是可以互相区别而被人们认识的事、物、概念等统统抽象为实体 +- **属性**:实体一般具有若干特征,称之为实体的属性;属性对应表中的列 +- **关系**:实体与实体之间的关系抽象为联系 + +***** + +#### 2.3映射基数 + +- 一对一:汽车和停车位的关系(一辆车停一个车位) +- 一对多:客房和客人的关系(一个客房可以住多个客人) +- 多对一 +- 多对多:学生和教师的关系(一个教师可以教多个学生,一个学生可以听多名教师讲课) + +***** + +#### 2.4转化E-R图为数据库模型图 + +==使用Microsoft Visio 2010== + +cdm表:单纯看结构 + +![image-20220901111541826](%E4%B8%80%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AE%BE%E8%AE%A1.assets/image-20220901111541826.png) + +pdm表:有多对多关系需要加一个表,设置联合主键 + +![image-20220901111648963](%E4%B8%80%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AE%BE%E8%AE%A1.assets/image-20220901111648963.png) + +多 指向---> 一 + +- 将各实体转换为对应的表,将各属性转换为各表对应的列 +- 标识每个表的主键列. +- 在表之间建立主外键,体现实体之间的映射关系 + +******* + +## (三)数据库设计 三大范式 + +### 1.了解规范和不规范设计 + +**不规范的表设计** + +>- 信息重复 +>- 更新异常 +>- 插入异常:无法正确表示信息 +>- 删除异常:丢失有效信息 + +****** + +**规范的表设计** + +> - 尽可能少的数据冗余 +> - 没有插入异常 +> - 没有删除异常 +> - 没有更新异常 + +### 2.第一范式(1NF) + +==关系中的每个属性必须是不可再分的简单项==,不能是属性组合,即属性的取值必须是不可拆分的原子值 + +比如一个地址列,中国北京市 拆成 中国 北京 + +(根据情况而定) + +******** + +### 3.第二范式(2NF) + +==表必须符合第一范式 ,表中的每列必须依赖主键== + +就是要求每个表只描述一件事情 + +比如: + +| 学号 | 姓名 | 课程号 | 课程名称 | 成绩 | +| ---- | ---- | ------ | --------- | ---- | +| s001 | 张三 | k001 | java | 60 | +| s002 | 李四 | k001 | sqlserver | 75 | +| s001 | 张三 | k002 | java | 95 | + +因为没有合适的主键会用联合主键学号和课程号,会出现部分依赖,成绩依赖于课程,课程依赖于课程号,姓名依赖于学号 + +要消除部分依赖,即把字段拆开形成新的表:学生表 课程表 成绩表 + +**** + +### 4.第三范式(3NF) + +**确保每列都和主键列直接相关,而不是间接相关** + +定义: + +==如果一个关系满足2NF,并且除了主键外的其他列既不部份依赖也不传递依赖于主键列,则满足第三范式== + +C依赖B依赖A就叫做**传递依赖** + +******* + +==规范过程即拆分过程:把表分的非常细,一旦出现多对一就会有主外键关系,N->1== +``` \ No newline at end of file -- Gitee From f24b985e650f03b4ff0a38849accd5c840a74752 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A9=B9=E6=BA=90=E9=93=A0?= <1905540517@qq.com> Date: Sun, 4 Sep 2022 21:13:33 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "9.1\344\275\234\344\270\232.md" | 139 +++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 "9.1\344\275\234\344\270\232.md" diff --git "a/9.1\344\275\234\344\270\232.md" "b/9.1\344\275\234\344\270\232.md" new file mode 100644 index 0000000..93a545a --- /dev/null +++ "b/9.1\344\275\234\344\270\232.md" @@ -0,0 +1,139 @@ +```` +```sql +create database Rabobank +go +use Rabobank +go +create table [user](--账号信息表 + useNO int primary key identity(1,1),--用户id + useName nvarchar(20) ,--用户姓名 + usephone char(11) unique,--手机号 + usepcard int check(usepcard<=3),--拥有卡的数量 + useAge int check(useAge between 18 and 100),--用户年龄 + useSex varchar(10) check(useSex in ('男','女'))--用户性别 +) +go + +create table bankcard--银行卡表 +( + banCardNO char(16) primary key ,--银行卡号 + remaining decimal(12,2),--余额 + banpass varchar(30) check(len(banpass)>=8),--密码 + useNO int references [user](useNO)--用户id +) +go + +create table Transinfo(--交易信息表 + traNO int primary key identity(1,1),--交易id + traTime date ,--交易时间 + trastype varchar(20) check(trastype in ('存钱','取钱')), --交易类型 + trasmoney decimal(12,2),--交易金额 + banNO char(16) references bankcard(banCardNO)--交易卡号 +) +go + +create table [transfer](--转账表 + tranNO int primary key identity(1,1),--交易id + tranTime date ,--交易时间 + transmoney decimal(12,2),--交易金额 + banNO char(16) references bankcard(banCardNO),--交易卡号 + trancaed char(16),--接收账号 +) +go + +create table Ttype(--银行卡状态表 + Tno int primary key identity(1,1),--状态id + banNO char(16) references bankcard(banCardNO),--卡号 + tType varchar(20) check(tType in('正常','挂失','冻结','注销')) +) + +insert [user] values +('张三',17828902422,1,20,'女'), +('李四',18528944562,1,18,'男'), +('王五',15856212433,1,19,'男') +go + +insert bankcard values +(5896549536512458,200,12345678,1), +(3659854652135654,25000,12345678,2), +(2365984512369411,10000,12345678,3) +go + +create trigger tr1_Transinfo +on Transinfo +for insert +as + declare @banNO char(16) --交易卡号 + declare @trastype char(16)--交易类型 + declare @smoney decimal(12,2)--金额 + declare @smoneyh decimal(12,2)--更新后的金额 + select @banNO=banNO,@trastype=trastype,@smoney=trasmoney from Transinfo + if(@trastype='取钱') + begin + update bankcard set @smoneyh=remaining-@smoney where banCardNO=@banNO + if(@smoneyh>0) + begin + update bankcard set remaining=remaining-@smoney where banCardNO=@banNO + end + else + begin + print'交易失败' + rollback transaction + end + + end + else + begin + update bankcard set remaining=remaining+@smoney where banCardNO=@banNO + end +go + +create trigger tr2_transfer +on [transfer] +for insert +as + declare @banNO char(16) --交易卡号 + declare @smoney decimal(12,2)--金额 + declare @smoneyh decimal(12,2)--更新后的金额 + declare @trancaed char(16)--接收卡号 + select @banNO=banNO,@smoney=transmoney,@trancaed=trancaed from [transfer] + update bankcard set @smoneyh=remaining-@smoney where banCardNO=@banNO + + if(@smoneyh>0) + begin + update bankcard set remaining=remaining-@smoney where banCardNO=@banNO + + update bankcard set remaining=remaining+@smoney where banCardNO=@trancaed + end + else + begin + print'交易失败' + rollback transaction + end +go + +insert Transinfo values +(GETDATE(),'取钱',50,5896549536512458), +(GETDATE(),'取钱',5000,3659854652135654), +(GETDATE(),'存钱',500,2365984512369411) +go + + +insert [transfer] values +(GETDATE(),500,2365984512369411,5896549536512458) +go + + +insert Ttype values +(2365984512369411,'正常'), +(5896549536512458,'正常'), +(3659854652135654,'正常') + +select * from [user] +select * from bankcard +select * from Transinfo +select * from [transfer] +select * from Ttype + +``` +```` \ No newline at end of file -- Gitee From de5ea38c05a1fa1849e3799e09858e9c0204939e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A9=B9=E6=BA=90=E9=93=A0?= <1905540517@qq.com> Date: Sun, 4 Sep 2022 21:15:41 +0800 Subject: [PATCH 3/3] zuoye --- .../9.1\344\275\234\344\270\232.md" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "9.1\344\275\234\344\270\232.md" => "9.1\344\275\234\344\270\232/9.1\344\275\234\344\270\232.md" (100%) diff --git "a/9.1\344\275\234\344\270\232.md" "b/9.1\344\275\234\344\270\232/9.1\344\275\234\344\270\232.md" similarity index 100% rename from "9.1\344\275\234\344\270\232.md" rename to "9.1\344\275\234\344\270\232/9.1\344\275\234\344\270\232.md" -- Gitee