当前位置: 首页 > news >正文

多表设计 - 一对一多对多

一.一对一关系概述:

例如:一位用户只能有一张身份证,一张身份证也只能对应一位用户

如果用户基本信息查询频率比用户身份信息查询频率高,为了提高效率,可拆分为两张表:

此时如何体现一对一的关系呢?其实一对一的关系可看成特殊的一对多的关系,一对多的关系只需要在多的一方添加外键即可,因此可以通过外键来体现一对一的关系,只需要在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE),这样的话一行数据就只会对应另外一张表的一行数据:UNIQUE是唯一约束


二.一对一关系代码演示:

1.准备工作:

a.用户基本信息表:

代码:

-- 一对一: 用户 与 身份证
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', '硕士');
b.用户身份信息表:

代码:

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);

2.此时字段user_id是唯一的,代表了一个用户只有一个身份证,在用户基本信息表中,也就一个身份证只对应了一位用户;


三.多对多关系概述:

比如一个学生可以由多位教师代课,一位代课老师可以有多位学生;

再比如学生与课程的关系:

多对多关系中通过简单的外键关系较为复杂,因为一个字段中只能填入一个数据,无法表示出多个数据

插入第三张中间表,比如查找id为1的学生选了哪些课程,只需要到中间表即学生课程关系表中找字段studentid为1的对应的课程字段courseid对应了哪些课程。查看课程被哪些学生选了同理。


四.多对多关系代码演示:

1.准备工作:

a.学生表:

代码:

--  多对多: 学生 与 课程
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');
b.课程表:

代码:

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');
c.中间表:学生课程关系表

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);

2.如果表与表建立了物理外键,那么可以通过可视化图形工具进行查看表之间的关系:


http://www.lryc.cn/news/500630.html

相关文章:

  • 实现 DataGridView 下拉列表功能(C# WinForms)
  • 使用Java创建RabbitMQ消息生产者的详细指南
  • 【LC】160. 相交链表
  • Spark架构及运行流程
  • Linux安装Python2.7.5(centos自带同款)
  • 上传ssh公钥到目标服务器
  • 【LLMs】用LM Studio本地部署离线大语言模型
  • SpringBoot下类加入容器的几种方式
  • 【Mysql】忘记Root密码后如何不影响数据进行重置密码
  • 宝塔内设置redis后,项目以及RedisDesktopManager客户端连接不上!
  • 一文了解模式识别顶会ICPR 2024的研究热点与最新趋势
  • 【深度学习】深刻理解BERT
  • 一种基于通义千问prompt辅助+Qwen2.5-coder-32b+Bolt.new+v0+Cursor的无代码对话网站构建方法
  • Java版-图论-最小生成树-Kruskal算法
  • 计算机网络知识总结
  • 普通算法——欧拉筛
  • 【知识科普】DNS(域名解析服务)深入解读
  • 数据结构第一弹-数据结构在不同领域的应用
  • 如何创建基于udp的客户端和服务端
  • ThinkPHP框架审计--基础
  • Java8 CompletableFuture异步编程
  • Java的Mvc整合Swagger的knife4框架
  • 分阶段构建在复杂系统中的应用:以推荐系统为例
  • 2024年12月9日历史上的今天大事件早读
  • 快捷构建AI大模型,源码自取可直接运行
  • 怎么为开源项目做贡献提PR?
  • 如何在 JavaScript 中设置定时器?
  • 【学习路线】Java
  • [GYCTF2020]Easyphp
  • JavaScript 数组的高级用法与最佳实践