实体关系模型详解

实体关系模型

实体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

如一个学生可以学习多门课程,一门课程也可以对应多个学习它的学生

一个医生可以有多个病人,一个病人也可以对应多个医生

ER图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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

数据表中的每一列都是不可再分的原子项。

关系型数据库起码要满足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就是消除这种传递依赖。

你可能感兴趣的:(数据库,sql,java)