• MySQL:多表概述


    1.  多表简述

          实际开发中,一个项目通常需要很多张表才能完成。

          例如一个商城项目的数据库,需要有很多张表:用户表、分类表、商品表、订单表.... 

    2.  单表的缺点 

    数据准备

    1) 创建一个数据库 db3

    CREATE DATABASE db3 CHARACTER SET utf8;

    2) 数据库中 创建一个员工表 emp

      包含如下列 eid, ename, age, dep_name, dep_location

      eid 为主键并 自动增长, 添加 5 条数据

    -- 创建emp表 主键自增 
    CREATE TABLE emp(
        eid INT PRIMARY KEY AUTO_INCREMENT,
        ename VARCHAR(20),
        age INT , 
        dep_name VARCHAR(20), 
        dep_location VARCHAR(20) 
    );
    -- 添加数据  
    INSERT INTO emp (ename, age, dep_name, dep_location) VALUES ('张百万', 20, '研发部', '广州'); 
    INSERT INTO emp (ename, age, dep_name, dep_location) VALUES ('赵四', 21, '研发部', '广州');  
    INSERT INTO emp (ename, age, dep_name, dep_location) VALUES ('广坤', 20, '研发部', '广州');  
    INSERT INTO emp (ename, age, dep_name, dep_location) VALUES ('小斌', 20, '销售部', '深圳');  
    INSERT INTO emp (ename, age, dep_name, dep_location) VALUES ('艳秋', 22, '销售部', '深圳');  
    INSERT INTO emp (ename, age, dep_name, dep_location) VALUES ('大玲子', 18, '销售部', '深圳'); 

    3) 单表的问题

         冗余, 同一个字段中出现大量的重复数据

      

     

    3. 解决方案 

    设计为两张表

    <1> 多表方式设计

        department  部门表 :  id,   dep_name, dep_location 

        employee 员工表:   eid,  ename,  age,  dep_id

    <2> 删除emp表, 重新创建两张表

    -- 创建部门表 
    -- 一方,主表 
    CREATE TABLE department(
         id INT PRIMARY KEY AUTO_INCREMENT,
         dep_name VARCHAR(30),
         dep_location VARCHAR(30) 
    );
    
    -- 创建员工表 
    -- 多方 ,从表 
    CREATE TABLE employee(
        eid INT PRIMARY KEY AUTO_INCREMENT, 
        ename VARCHAR(20),
        age INT,
        dept_id INT 
    );

    <3> 添加部门表数据

    -- 添加2个部门 
    INSERT INTO department VALUES(NULL, '研发部','广州'),(NULL, '销售部', '深圳'); 
    SELECT * FROM department;

    <4> 添加员工表数据

    -- 添加员工,dep_id表示员工所在的部门 
    INSERT INTO employee (ename, age, dept_id) VALUES ('张百万', 20, 1); 
    INSERT INTO employee (ename, age, dept_id) VALUES ('赵四', 21, 1); 
    INSERT INTO employee (ename, age, dept_id) VALUES ('广坤', 20, 1); 
    INSERT INTO employee (ename, age, dept_id) VALUES ('小斌', 20, 2); 
    INSERT INTO employee (ename, age, dept_id) VALUES ('艳秋', 22, 2); 
    INSERT INTO employee (ename, age, dept_id) VALUES ('大玲子', 18, 2); 
    SELECT * FROM employee;

    <5> 表关系分析   

    部门表与员工表的关系

       1) 员工表中有一个字段dept_id 与部门表中的主键对应,员工表的这个字段就叫做 外键   

       2) 拥有外键的员工表 被称为 从表 , 与外键对应的主键所在的表叫做 主表

     

    4. 目前的多表设计的问题    

        当我们在 员工表的 dept_id 里面输入不存在的部门id ,数据依然可以添加!

        显然,这是不合理的.

    -- 插入一条 不存在部门的数据 
    INSERT INTO employee (ename,age,dept_id) VALUES('无名',35,3);

    •  实际上我们应该保证,员工表所添加的 dept_id , 必须在部门表中存在. 

    解决方案:

    •   使用外键约束,约束 dept_id ,必须是 部门表中存在的id 
  • 相关阅读:
    Azure Pipelines —— 资料合集
    training —— Applying Functional(函数式编程) Principles in C# 6 (overview)
    Mongodb 学习路线
    training_ Refactoring from Anemic Domain Model Towards a Rich One (Introducing an Anemic Domain Model)
    快速访问电脑软件的 辅助app—— PowerToys
    NoSQL
    AWS
    training —— Refactoring from Anemic Domain Model Towards a Rich One (overview)
    病毒查杀 clamav —— 资料合集 & windows上安装 & .net项目中引入
    docker for windows 收费
  • 原文地址:https://www.cnblogs.com/JasperZhao/p/15014735.html
Copyright © 2020-2023  润新知