MySQL -04 数据库多表设计原则

发布于:2023-01-04 ⋅ 阅读:(324) ⋅ 点赞:(0)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

表与表之间的数据记录有关系(relationship)。现实世界中的各种实体以及实体之间的各种联系均用 关系模型来表示。在MySQL-01中概述过,这一章主要体现的是对其代码过程实现。


1.一对一关联(设计)

1.1 一对一关联概述

  • 概述:
    • 表A中的一条记录可以确定表B中的一条记录。
    • 表B中的一条记录可以确定表A中的一条记录。
    • 这样A表与B表形成一一对应关系
  • 在实际的开发中应用不多,因为一对一可以创建成一张表。
  • 两种建表原则:
    • 外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一。
    • 外键是主键:主表的主键和从表的主键,形成主外键关系。
  • A、B两个表若不建立关联出席的问题
    • 出现脏读的问题,也就是可以在B表中添加任意数据,并没有受到A表的约束
    • 解决方式:B表与A表建立关联关系
    • 建立方式:通过foreign key外键约束来建立关系
    • 通过下面案例来进一步说明

1.2 案例:学生基本信息表和档案表

  • 案例描述: 设计:学生表 :学号、姓名、手机号码、班级、系别、身份证号码、家庭住址、籍贯、紧急联系人、…

    • 拆为两个表: 两个表的记录是一一对应关系。
    • 基础信息表 (常用信息): 学号、姓名、手机号码、班级
    • 档案信息表 (不常用信息): 学号、身份证号码、家庭住址、籍贯…
  • 实现步骤:

    1. 创建两个表,基本信息(常用信息表):t_student 档案信息表(不常用的信息):t_student_archives。这时候若不建立两个表的关联关系,就会出现脏读现象。
    2. 对档案信息表中的学号建立外键约束,关联到主键的学号。这样就形成一对一关系,在添加档案信息时,首先就要田间基本信息。
    3. 下面就是代码实现。
  • 代码演示

    # 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 案例:部门表和员工表

  • 案例描述:

    • 员工表:编号、姓名、…、所属部门
    • 部门表:编号、名称、简介
  • 实现步骤:

    1. 创建两个表,部门表:t_depart,员工表t_employee。
    2. 部门表与员工是一对多关系,一个部门可以有多个员工。若不建立练习,会出现脏读现象。
    3. 建立关联:将员工表中所属部门编号的字段设置外键约束,指向部门表中的编号。
  • 代码演示

    # 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 案例:产品表和订单表

  • 案例描述: “订单”表和“产品”表有一种多对多的关系,这种关系是通过与“订单明细”表建立两个一对多关系来 定义的。一个订单可以有多个产品,每个产品可以出现在多个订单中。

    • 产品表 :“产品”表中的每条记录表示一个产品。
    • 订单表 :“订单”表中的每条记录表示一个订单。
    • 订单明细表 :每个产品可以与“订单”表中的多条记录对应,即出现在多个订单中。一个订单 可以与“产品”表中的多条记录对应,即包含多个产品。
  • 实现步骤

    1. 创建两张表,产品表t_product(产品编号,产品名称,价钱,产品描述…) ,订单表t_order(订单编号,地址,邮编,总价,联系方式…)
    2. 创建第三张表t_product_order(编号,产品编号,订单编号)用来连接产品表和订单表
    3. 将t_product_order表中的产品编号设置外键约束,指向产品表t_product中的产品编号
    4. 将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 后查看

网站公告

今日签到

点亮在社区的每一天
去签到