三大范式&&临时表插入

101 阅读2分钟

三大范式&&临时表插入

  • 分析实体之间的关系

一对一的关系

造句:一个身份证对应一个人,一个人只有一个身份证

如何表示?

方法一:可以把两个实体用一张表来表示

方法二:可以用两张表来表示,其中一张表包含了另一个表的id

一对多的关系

造句:一个学生一个处于一个班级,一个班级可以包含多个学生

如何表示?

方法一:在班级表中,新增一列,表示这个班级里的学生id都有啥

-- student表(学号,姓名...)
-- class表(班级编号,班级名称,学生列表)
   					 1      java100   1,2,3,4,5,6
    				 2      java200   7,8,9,10,11

方法二:班级表不变,在学生表中,新增一列,classId

-- class表(班级编号,班级名称)
              1     java100
              2     java101
    
-- student(学号,学生姓名,所在班级)
             1     张三     1
             2     李四     1

注意:对于mysql来说表示一对多的时候,只能采用方法二,因为mysql中没有提供类似于“数组”这样的类型,但是redies有数组类型。

多对多的关系

造句:

  • 一个学生可以选多个课程,一个课程包含多个学生
  • M个学生可以选N门课程

如何表示

仅此一招:使用一个关联表,来表示两个实体之间的关系~

-- 学生表(学号,姓名)
           1   张三
           2   李四
           3   王五
-- 课程表(课程编号,课程姓名)
           1        语文
           2        数学
           3        英语
-- 学生课程表(学号,课程编号)
             1       1
             1       2
             3       1
造句:
学号为1的同学,选了课程编号为1的课程
课程编号为1的课程,包含了一个学号为1的同学
张三选了语文课
语文课上有张三

临时表插入

众所周知select查出来的数据是在内存中的,一旦运行结束数据将会释放!那么临时表插入就能将内存中的数据插入到表中,即写到硬盘,

  • 临时表数据写到硬盘
  • 列数和数据类型保持一致
-- 准备工作
create table A(id int(10),name varchar(10));
insert into A values(1,'nick01'),(2,'nick02'),(3,'nick03');

create table B(id int(20),name varchar(100));

-- 将A表数据插入到B表
insert into B select * from A;