实体Entity:一个表就是一个实体
关系Relationship:实体与实体之间的联系
实体关系模型也称为ER模型
用图形表示ER模型时,这个图就称为ER图。
用矩形表示实体,用椭圆形表示实体的属性,用菱形表示实体之间的关系,用直线连接各个图形。
实体A与实体B之间唯一对应。
如一个国家有一个领导人,一个人对应一个配偶。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-drSjf8JI-1672632498874)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\1672123838190.png)]
可以使用一张表实现,但如果使用一张表保存时,后期维护扩展时较为不便。
最好使用两张表。
创建国家表
create table country(
country_id int not null primary key auto_increment,
country_name varchar(20) not null,
country_population bigint not null,
country_area int not null
)
创建领导人表
create table leader(
leader_id int not null primary key auto_increment,
leader_name varchar(20) not null,
leader_birthday date not null
)
这时两张表是独立的,并不能体现一对一的管理关系,可以通过以下方式体现一对一。
方式一:
创建一个管理表,保存两张表中的主键,添加唯一约束
create table relation(
relation_no int not null primary key auto_increment,
country_id int not null unique,
leader_id int not null unique,
foreign key (leader_id) references leader(leader_id),
foreign key (country_id) references country(country_id)
)
方式二:
在以上的两个实体表中,选择任意一张表中添加一列,保存另一张表中的主键,添加唯一约束
create table leader(
leader_id int not null primary key auto_increment,
leader_name varchar(20) not null,
leader_birthday date not null,
country_id int not null,
foreign key (country_id) references country(country_id)
)
一对多:一个实体A对应多个实体B
多对一:多个实体A对应一个实体B
如一个人有多辆车,一个教官训练多个学员,一个宿舍管理员管理多个宿舍
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RysQnNvJ-1672632498876)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\1672123978704.png)]
创建主表(一)
create table coach(
coach_id int not null primary key auto_increment,
coach_name varchar(20) not null,
coach_leave varchar(20) not null
)
创建从表(多),在表中添加字段关联主表中的主键字段
create table student(
stu_id int not null primary key auto_increment,
stu_name varchar(20) not null,
stu_phone varchar(20) not null,
coach_id int not null,
foreign key (coach_id) references coach(coach_id0)
)
一个实体A可以对应多个实体B,一个实体B可以对应多个实体B
如一个学生可以学习多门课程,一门课程也可以对应多个学习它的学生
一个医生可以有多个病人,一个病人也可以对应多个医生
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2PdW81u9-1672632498877)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\1672125391340.png)]
创建课程表
create table course(
course_id int not null primary key auto_increment,
course_name varchar(20) not null,
course_time varchar(10) not null
)
创建学生表
create table student(
stu_id int not null primary key auto_increment,
stu_name varchar(20) not null,
stu_phone varchar(20) not null
)
体现多对多关系的表:成绩表
该表中必须要包含以上两个实体表中的主键字段
create table score(
s_id int not null primary key auto_increment,
course_id int not null,
stu_id int not null,
cj int not null,
-- 可以选择添加外键约束
foreign key (course_id) references course(course_id),
foreign key (stu_id) references course(stu_id)
)
一对一:创建各自的实体表,在任意一张表中添加另一站表的主键字段,并添加唯一约束
一对多/多对一:先创建主表(一),在创建从表(多),在从表中添加主表中的主键字段,外键可选
多对多:创建各自的实体表,在创建第三张表:“联系表”,在“联系表”中添加两个实体表中的主键字段,外键可选
“医院信息管理系统”功能。
医生模块:医生的CURD
病人模块:病人的CURD
病房管理:病房的CURD
诊断模块:哪个医生在什么时间诊断了哪个病人,记录信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SwHhiFAo-1672632498878)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\1672127763259.png)]
-- 医生表
create table doctor(
id int not null primary key auto_increment,
name varchar(20) not null,
section varchar(20) not null,
major varchar(50) not null
)
-- 病人表
create table patient(
id int not null primary key auto_increment,
name varchar(20) not null,
age int not null
phone varchar(20),
address varchar(50)
)
-- 诊断
create table diagnose(
diagnose_no int not null primary key auto_increment,
doctor_id int not null,
patient_id int not null,
diagnose_date datetime not null,
diagnose_result text
)
诊断病人流程:
-- 1、管理员登录系统向医生表中添加一条所记录
insert into doctor values(9001,'顾魏','内科','消化科')
-- 2、医生登录系统,向病人表中添加一条数据
insert into patient values(null,'大强',22,null,null)
-- 3、添加诊断记录
insert into diagnose values(null,9001,1,now(),'确诊为胃癌')
数据库设计的规范,简称为范式**(NF)**
范式分为第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BC范式(BCNF)、第四范式(4NF)和第五范式(5NF)共六种。
这六种范式的级别越高,表示数据库设计的结果越规范,每一个高级版的范式都包含了低级别的范式。
通常设计数据库时,只需要满足3NF即可。
数据表中的每一列都是不可再分的原子项。
关系型数据库起码要满足1NF,才能创建表。
上表中的联系方式列,可以再分为手机和qq两列,所以它不满足1NF。若要满足,将其拆开。
在满足1NF的基础上消除部分依赖。
对于联合主键而言,每一个非主属性字段都需要完全依赖于主属性,而不是依赖其中一部分。
在上图中,无法用学号做主键,需要将学号和科目组合为联合主键,通过联合主键才能得到分数。
除学号和科目外,其他字段都是非主键字段,分数完全依赖于联合主键,其他字段不满足,所以进行如下修改。
在满足2NF的基础上,消除传递依赖。
在上图中,系主任是通过学号–>系别–>系主任获取,系主任传递依赖于学号,消除这个传递依赖。
用于唯一区分每条记录的一个字段,称为主键字段,如学号、身份证号。
通常选择能唯一且几乎不会改变的某个字段作为主键。如果没有,自定义一个id列作为主键
如果一个字段不能唯一区分每条记录,而是需要多个字段才能唯一区分时,这些字段一起组成了联合主键。
如果能够通过A和B得到C,A和B都不能单独得到C时,称C完全依赖于A和B。
通过(学号+科目)联合主键–>分数,分数完全依赖于联合主键。
其他字段完全依赖于学号。
如果能够通过A和B得到C,单独通过A或B也可以得到C,就称为C部分依赖于A和B。
如(学号+科目)联合主键–>姓名,其实只通过学号也可以得到姓名,称为姓名部分依赖于联合主键。
除了成绩之外,其余字段都是部分依赖于(学号+科目)联合主键。
2NF就是消除这种部分依赖,只保存完全依赖。
如果通过A可以得到B,通过B可以得到C,称为C传递依赖于A。
如学号–>系–>系主任,其实只通过系也能得到系主任,称为系主任传递依赖于学号。
通过(学号+科目)联合主键–>分数,分数完全依赖于联合主键。
其他字段完全依赖于学号。
如果能够通过A和B得到C,单独通过A或B也可以得到C,就称为C部分依赖于A和B。
如(学号+科目)联合主键–>姓名,其实只通过学号也可以得到姓名,称为姓名部分依赖于联合主键。
除了成绩之外,其余字段都是部分依赖于(学号+科目)联合主键。
2NF就是消除这种部分依赖,只保存完全依赖。
如果通过A可以得到B,通过B可以得到C,称为C传递依赖于A。
如学号–>系–>系主任,其实只通过系也能得到系主任,称为系主任传递依赖于学号。
3NF就是消除这种传递依赖。