zoukankan      html  css  js  c++  java
  • MySQL: 4、多表、外键、数据库设计

    一、多表

      1、主键:

          用来唯一标识一条记录,不能有重复的,不允许为空,用来保证数据的完整性,并且主键只能有一个 

      2、外键:

          表的外键是另一个表的主键,外键可以重复,可以 为空,但是为空数据就跟与之相关联的表没关系了

          外键主要使用来和其他表建立联系用的,其他表就叫做主表。一个表可以多有个外键

      3、 从表:

          外键所在的表就叫做从表,也就是被约束的表

         4、 主表:

          主键id所在的表就叫做主表,也就是约束别的表

      5、 外键约束:

         1)外键约束主要是让两张表之间产生一个对应的关系,从而保证主从表引用的完整性 

         2)创建外键约束:

          1) 新建表时添加外键

           CREATE TABLE employee(

              eid INT PRIMARY KEY AUTO_INCREMENT,

              ename VARCHAR(20),

              age INT,

              dept_id INT,

              -- 添加外键约束

              CONSTRAINT emp_dept_fk FOREIGN KEY(dept_id) REFERENCES department(id)

            );  

           [CONSTRAINT] [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名)

          2) 已有表添加外键

          ALTER TABLE 从表 ADD [CONSTRAINT] [外键约束名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主键字段名);

          

           3)删除外键约束:

          ALTER TABLE 从表 DROP FOREIGN KEY 外键约束名称;     

          ps:如果不知道约束名可以通过:  show create table 表名; 来查看外键名

        

           4)删除外键约束的注意事项

              1) 从表外键类型必须与主表主键类型一致 否则创建失败. 

            2) 添加数据时, 应该先添加主表中的数据.

            3) 删除数据时,应该先删除从表中的数据.

      6、级联删除操作: 在删除主表数据的同时也需要删除从表的数据的话,就可以使用级联删除操作

            1) 级联删除: ON DELETE CASCADE

            2) 案例:创建表时添加级联删除      

               CREATE TABLE employee(

              eid INT PRIMARY KEY AUTO_INCREMENT,

              ename VARCHAR(20),

              age INT,

              dept_id INT,

              CONSTRAINT emp_dept_fk FOREIGN KEY(dept_id) REFERENCES department(id),

              ON DELETE CASCADE --  添加级联删除

               );  

              添加级联删除之后,删除主表的数据之后,主表对应的从表数据也会被删除

              假设有个主表: 部门表和 从表: 员工表,当删除部门表对应主键id 为2的数据之后,

              从表也就是员工表中外键对应为2的数据也会自动删除      

    2、多表关系设计

       1、表与表之间的三种关系:

         一对多关系:最常见的关系,例如班级对学生,部门对员工

         多对多关系:学生对应课程,用户对应角色

         一对一关系:使用较少,因为一对一关系可以合成为一张表 

      2、一对多关系(1:n)

          例如:班级和学生,部门和员工,客户和订单,分类和商品

         一对多建表原则:

          在从表(多方)创建一个字段,该字段作为外键指向主表(一方)的主键

        

       3、多对多关系(m:n)

          例如:老师和学生,学生和课程,用户和角色 

        n 多对多关系建表原则:

          需要创建第三张表(中间表),中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键

        

      4.一对一关系(了解)

        在实际开发钟应用不用多,因为一对一可以创建成一张表

        一对一建表原则:

        外键唯一 主表的主键和从表的外键(唯一),形成外键关系,外键唯一 UNIQUE

       

    3、多表查询:内连接、外连接

      0) 多表查询前需要确定的事情:

        1. 查询几张表

        2.表的连接条件

        3.查询所用到的字段

        4.查询的条件

      1)交叉查询:两张表交叉连接查询会产生笛卡尔积,所以基本不会使用

        select  字段名  from  表1,表2;

      2)内连接查询:通过指定的条件去匹配两张表中的内容,匹配不上就不显示 

         - 隐式内连接

          语法格式: select 字段名... from  左表,右表  where  链接条件; 

         - 显式内链接     

          语法给是:select 字段名... from 左表 [inner] join 右表 on 连接条件;

      3) 外连接查询:

        - 左外连接: left [outer] join

               SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 条件;

           特点: 以左表为基准,匹配右边表中的数据,如果匹配得上,就展示匹配到的数据

               如果匹配不到,左表中的数据正常展示,右边的展示为null   

        - 右外连接:right [outer] join 

              SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 条件

            特点: 以右表为基准,匹配左表中的数据,如果能匹配到,就展示匹配到的数据

              如果匹配不到,右表中的数据正常展示,左边展示为null

      4)内连接、左外链接、右外链接方式总结:

          

        内连接: inner join , 只获取两张表中 交集部分的数据.

          左外连接: left join , 以左表为基准 ,查询左表的所有数据, 以及与右表有交集的部分

          右外连接: right join , 以右表为基准,查询右表的所有的数据,以及与左表有交集的部分

    4、子查询 SubQuery

       概念:一条select 查询语句的结果, 作为另一条 select 语句的一部分   

       特点:子查询必须放在小括号中

          子查询一般作为父查询的查询条件使用

       子查询常见分类:

         where型 子查询: 子查询如果是一个字段(单列)就将子查询的结果, 作为父查询的比较条件

         from型 子查询 : 将子查询的结果是多个字段就 作为 一张表,提供给父层查询使用,子查询的

                 结果作为一张表 时,一定要起一个别名,否则无法访问表中的字段

           exists型 子查询: 子查询的结果是单列多行, 类似一个数组, 父层查询使用 IN 函数 ,包含子查 询的结果

       

    5、数据库三范式(空间最省)     

      概念:三范式就是设计数据库的规则

         - 为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。

          范式是符合某一种设计要求的总结。要想设计一个结构合理的关 系型数据库,必须满足一定的范式

         - 满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的 称为第二范式(2NF) ,

          其余范式以此类推。一般说来,数据库只需满足第三范式(3NF)就 行了

       

      第一范式 1NF:

         - 原子性,做到列不可拆分

         - 第一范式是最基本的范式,数据库表里面的字段都是单一属性的,不可再分,如果数据表中每个字段都是不可

          再分的最小数据单元,则满足第一范式。

           - 示例:地址信息表中, contry这一列,还可以继续拆分,不符合第一范式

           

      第二范式 2NF:

         - 在第一范式的基础上更进一步,目标是确保表钟的每个列和主键相关

         - 一张表只能表述一件事

           - 示例:

            学员信息表中其实在描述两个事物 , 一个是学员的信息,一个是课程信息

            如果放在一张表中,会导致数据的冗余,如果删除学员信息, 成绩的信息也被删除了

          

        第三范式 3NF:

         - 消除传递依赖

         - 表的信息,如果能够被推到出来,就不应该单独的设计一个字段来存放

         - 示例:通过number 与 price字段就可以计算出总金额,不要在表中再做记录(空间最省)

         

    6、数据库反三范式

      1、概念

        反范式化指的是通过增加冗余或重复的数据来提高数据库的读性能

        浪费存储空间,节省查询时间 (以空间换时间)
      2、什么是冗余字段 ?

        设计数据库时,某一个字段属于一张表,但它同时出现在另一个或多个表,

          且完全等同于它在其本 来所属表的意义表示,那么这个字段就是一个冗余字段

      3、示例

        

          使用场景:

        - 当需要查询“订单表”所有数据并且只需要“用户表”的name字段时, 没有冗余字段 就需要去join

           连接用户表,假设表中数据量非常的大, 那么会这次连接查询就会非常大的消耗系统的性能.

        - 这时候冗余的字段就可以派上用场了, 有冗余字段我们查一张表就可以了.

      4、总结:

        创建一个关系型数据库设计,我们有两种选择

        1,尽量遵循范式理论的规约,尽可能少的冗余字段,让数据库设计看起来精致、优雅、让人心醉。

        2,合理的加入冗余字段这个润滑剂,减少join,让数据库执行性能更高更快。

    详细资料

  • 相关阅读:
    leetcode刷题-- 4. 贪心
    golang 中的引号
    记录博客的目的
    java返回树形结构的正确姿势
    java -jar xxxx.jar --server.port(指定启动端口无效)
    Spring 中@NotNull, @NotEmpty和@NotBlank之间的区别是什么?
    IntelliJ IDEA远程连接linux,一键上传jar包
    linux 运行Jar包时指定启动端口
    @Validated注解对单个实体类与List集合的验证
    linux -bash: ./startup.sh: /bin/sh^M: 坏的解释器: 没有那个文件或目录
  • 原文地址:https://www.cnblogs.com/hzaixt/p/13743433.html
Copyright © 2011-2022 走看看