MySQL-多表设计-一对一&多对多

一对一

  • 案例:用户 与身份证信息 的关系
  • 关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其它字段放在另一张表中,以提高操作效率
  • 实现:在任意一方加入外键,关联另一方的主键,并且设计外键为唯一的(unique)
  • 具体代码及运行结果如下:
  • create table tb_user(
        id int unsigned  primary key auto_increment comment 'ID',
        name varchar(10) not null comment '姓名',
        gender tinyint unsigned not null comment '性别, 1 男  2 女',
        phone char(11) comment '手机号',
        degree varchar(10) comment '学历'
    ) comment '用户信息表';
    
    insert into tb_user values (1,'白眉鹰王',1,'18812340001','初中'),
                            (2,'青翼蝠王',1,'18812340002','大专'),
                            (3,'金毛狮王',1,'18812340003','初中'),
                            (4,'紫衫龙王',2,'18812340004','硕士');
    
    
    create table tb_user_card(
        id int unsigned  primary key auto_increment comment 'ID',
        nationality varchar(10) not null comment '民族',
        birthday date not null comment '生日',
        idcard char(18) not null comment '身份证号',
        issued varchar(20) not null comment '签发机关',
        expire_begin date not null comment '有效期限-开始',
        expire_end date comment '有效期限-结束',
        user_id int unsigned not null unique comment '用户ID',
        constraint fk_user_id foreign key (user_id) references tb_user(id)
    ) comment '用户信息表';
    
    insert into tb_user_card values (1,'汉','1960-11-06','100000100000100001','朝阳区公安局','2000-06-10',null,1),
            (2,'汉','1971-11-06','100000100000100002','静安区公安局','2005-06-10','2025-06-10',2),
            (3,'汉','1963-11-06','100000100000100003','昌平区公安局','2006-06-10',null,3),
            (4,'回','1980-11-06','100000100000100004','海淀区公安局','2008-06-10','2028-06-10',4);

  •  

  • 上述的两个表中的信息都是对于用户信息的描述,但是将用户的基本信息独立为一张表,并且同剩余信息建立了一对一的联系。

多对多

  • 案例:学生 与 课程的关系
  • 关系:一个学生可以选修多个课程,一门课程也可以供多个学生选择
  • 实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方外键
  • 具体代码及运行结果如下:
  • create table tb_student(
        id int auto_increment primary key comment '主键ID',
        name varchar(10) comment '姓名',
        no varchar(10) comment '学号'
    ) comment '学生表';
    insert into tb_student(name, no) values ('黛绮丝', '2000100101'),('谢逊', '2000100102'),('殷天正', '2000100103'),('韦一笑', '2000100104');
    
    
    create table tb_course(
       id int auto_increment primary key comment '主键ID',
       name varchar(10) comment '课程名称'
    ) comment '课程表';
    insert into tb_course (name) values ('Java'), ('PHP'), ('MySQL') , ('Hadoop');
    
    
    create table tb_student_course(
       id int auto_increment comment '主键' primary key,
       student_id int not null comment '学生ID',
       course_id  int not null comment '课程ID',
       constraint fk_courseid foreign key (course_id) references tb_course (id),
       constraint fk_studentid foreign key (student_id) references tb_student (id)
    )comment '学生课程中间表';
    
    insert into tb_student_course(student_id, course_id) values (1,1),(1,2),(1,3),(2,2),(2,3),(3,4);

  •  

  • 三个表之间的关系如下

     

猜你喜欢

转载自blog.csdn.net/weixin_64939936/article/details/131798578
今日推荐