提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
表与表之间的数据记录有关系(relationship)。现实世界中的各种实体以及实体之间的各种联系均用 关系模型来表示。在MySQL-01中概述过,这一章主要体现的是对其代码过程实现。
1.一对一关联(设计)
1.1 一对一关联概述
- 概述:
- 表A中的一条记录可以确定表B中的一条记录。
- 表B中的一条记录可以确定表A中的一条记录。
- 这样A表与B表形成一一对应关系
- 在实际的开发中应用不多,因为一对一可以创建成一张表。
- 两种建表原则:
- 外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一。
- 外键是主键:主表的主键和从表的主键,形成主外键关系。
- A、B两个表若不建立关联出席的问题
- 出现脏读的问题,也就是可以在B表中添加任意数据,并没有受到A表的约束
- 解决方式:B表与A表建立关联关系
- 建立方式:通过foreign key外键约束来建立关系
- 通过下面案例来进一步说明
1.2 案例:学生基本信息表和档案表
案例描述: 设计:学生表 :学号、姓名、手机号码、班级、系别、身份证号码、家庭住址、籍贯、紧急联系人、…
- 拆为两个表: 两个表的记录是一一对应关系。
- 基础信息表 (常用信息): 学号、姓名、手机号码、班级
- 档案信息表 (不常用信息): 学号、身份证号码、家庭住址、籍贯…
实现步骤:
- 创建两个表,基本信息(常用信息表):
t_student
档案信息表(不常用的信息):t_student_archives
。这时候若不建立两个表的关联关系,就会出现脏读现象。 - 对档案信息表中的学号建立外键约束,关联到主键的学号。这样就形成一对一关系,在添加档案信息时,首先就要田间基本信息。
- 下面就是代码实现。
- 创建两个表,基本信息(常用信息表):
代码演示
# 1.创建基本信息表t_student create table t_student( sid int primary key, # 学号 name varchar(20) not null, # 姓名 phone varchar(11) not null unique, # 班级 classname varchar(15) ); # 2.创建档案信息表t_student_archives. create table t_student_archives( sid int primary key, # 学号 idcard varchar(25), # 身份证号 address varchar(100), # 地址 nativeplace varchar(10) #籍贯 ); # 3.创建档案信息表t_student_archives中sid的外键约束 alter table t_student_archives add foreign key (sid) references t_student(sid);
创建的表关系如图所示
2.一对多关联(设计)
2.1 一对多关联概述
- 概述
- 表A中的一条记录能够查到表B中的多条记录。
- 表B中的一条记录只能查到表A中的一条记录。
- 这样表A与表B形成了一对多的关联关系
- 常见实例场景: 客户表和订单表 , 分类表和商品表 , 部门表和员工表 。
- 一对多建表原则: 在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键
- A、B两个表若不建立关联出席的问题
- 出现脏读的问题,也就是可以在B表中添加任意数据,并没有受到A表的约束
- 解决方式:B表与A表建立关联关系
- 建立方式:通过foreign key外键约束来建立关系
- 通过下面案例来进一步说明
2.2 案例:部门表和员工表
案例描述:
- 员工表:编号、姓名、…、所属部门
- 部门表:编号、名称、简介
实现步骤:
- 创建两个表,部门表:t_depart,员工表t_employee。
- 部门表与员工是一对多关系,一个部门可以有多个员工。若不建立练习,会出现脏读现象。
- 建立关联:将员工表中所属部门编号的字段设置外键约束,指向部门表中的编号。
代码演示
# 1.创建部门表t_depart create table t_depart( depart_no int primary key, # 部门编号 depart_name varchar(15) not null, # 部门名称 depart_introduce varchar(100) # 部门简介 ); # 2.创建员工表t_employee create table t_employee( em_no int primary key, # 员工编号 em_name varchar(15) not null, # 员工姓名 em_depart int not null # 所属部门 ); # 4.建立俩个表的联系,设置t_employee中em_depart外键约束 alter table t_employee add foreign key(em_depart) references t_depart(depart_no);
创建的表关系如图所示
3.多对多关系(设计)
3.1 多对多关联概述
- 概述
- 表A中的一个记录可以查询到表B中的多个记录。
- 表B中的一个记录可以查询到表A中的多个记录。
- 这样表A与表B形成了多对多记录。
- 要表示多对多关系,必须创建第三个表,该表通常称为 联接表 ,它将多对多关系划分为两个一对多关 系。将这两个表的主键都插入到第三个表中。
- 使用场景:
- 学生-课程:一个学生可以选多门课程,一门课程可以被多个学生选择。
- 产品-订单:一个产品可以有多个订单,一个订单可以有多个产品。
- 用户-角色:一个用户可以有多个角色,一个角色可以被多个用户使用。
- …
3.2 案例:产品表和订单表
案例描述: “订单”表和“产品”表有一种多对多的关系,这种关系是通过与“订单明细”表建立两个一对多关系来 定义的。一个订单可以有多个产品,每个产品可以出现在多个订单中。
- 产品表 :“产品”表中的每条记录表示一个产品。
- 订单表 :“订单”表中的每条记录表示一个订单。
- 订单明细表 :每个产品可以与“订单”表中的多条记录对应,即出现在多个订单中。一个订单 可以与“产品”表中的多条记录对应,即包含多个产品。
实现步骤
- 创建两张表,产品表t_product(产品编号,产品名称,价钱,产品描述…) ,订单表t_order(订单编号,地址,邮编,总价,联系方式…)
- 创建第三张表t_product_order(编号,产品编号,订单编号)用来连接产品表和订单表
- 将t_product_order表中的产品编号设置外键约束,指向产品表t_product中的产品编号
- 将t_product_order表中的订单编号设置外键约束,指向订单表t_order中的订单编号
代码演示
# 1.创建两张表,产品表t_product(产品编号,产品名称,价钱,产品描述....) # 订单表t_order(订单编号,地址,邮编,总价,联系方式......) create table t_product( pro_no int primary key, # 产品编号 pro_name varchar(15) not null, # 产品名称 pro_price decimal(10,2) , # 产品价格 pro_introduce varchar(100) # 产品介绍 ); create table t_order( ord_no int primary key, # 订单编号 ord_arrdess varchar(100) not null, # 地址 ord_postcode varchar(10), # 邮编 ord_total decimal(10,2), # 总价 ord_phone varchar(11), # 联系方式 ord_name varchar(20) # 联系人 ); # 2.创建第三张表t_product_order(编号,产品编号,订单编号)用来连接产品表和订单表 create table t_product_order( id int primary key, # 编号 pro_no int not null, # 产品编号 ord_no int not null # 订单编号 ); # 3.将t_product_order表中的产品编号设置外键约束,指向产品表t_product中的产品编号 alter table t_product_order add foreign key(pro_no) references t_product(pro_no); # 4.将t_product_order表中的订单编号设置外键约束,指向订单表t_order中的订单编号 alter table t_product_order add foreign key(ord_no) references t_order(ord_no);
创建的表关系如图所示
本文含有隐藏内容,请 开通VIP 后查看