关系

多对多的关系,如何通过mysql来表示

站在老师的角度

一个老师可以教多个学生,

一个老师也可以教一个学生。

站在学生的角度

一个学生可以被一个老师教

一个学生也可以被多个老师教

结论:如果站在两边看都是一对多的情况,那么这个关系就是多对多的。

问题:

如果表示a老师教过x学生和y学生,x学生和y学生同时也被b老师教

解决方法

多对多关系,无论是把外键放在哪一张表都不合适,因为可能有多个值

解决方案:建立一个中间的关系表

create table student(

id int primary key auto_increment,

name char(10)

) charset utf8;

create table teacher(

id int primary key auto_increment,

name char(10)

) charset utf8;

create table t_s_r(

id int primary key auto_increment,

t_id int,

s_id int,

foreign key(t_id) references teacher(id),

foreign key(s_id) references student(id)

) charset utf8 ;

insert into teacher values(null,"bgon"),(null,"nike");

insert into student values(null,"老王"),(null,"老李");

# 老王被bgon教过

insert into t_s_r values(null,1,1);

# nike教过老李

insert into t_s_r values(null,2,2);

# nike教过老王

insert into t_s_r values(null,2,1);

# 现在已知老师名称为bgon,请找出他教过的那些学生

mysql> select id from teacher where name="bgon";

+----+

| id |

+----+

| 1 |

+----+

1 row in set (0.00 sec)

mysql> select s_id from t_s_r where t_id=1;

+------+

| s_id |

+------+

| 1 |

+------+

1 row in set (0.00 sec)

mysql> select name from student where id=1;

+--------+

| name |

+--------+

| 老王 |

+--------+

# 子查询

mysql> select name from student where id=(select s_id from t_s_r where t_id=(select id from teacher where name="bgon"));

+--------+

| name |

+--------+

| 老王 |

+--------+

1 row in set (0.00 sec)

# 已知学生名为老李,请查询出哪些老师教过他.

mysql> select id from student where name = "老李";

+----+

| id |

+----+

| 2 |

+----+

1 row in set (0.00 sec)

mysql> select t_id from t_s_r where s_id=2;

+------+

| t_id |

+------+

| 2 |

+------+

1 row in set (0.00 sec)

mysql> select name from teacher where id=2;

+------+

| name |

+------+

| nike |

+------+

1 row in set (0.00 sec)

# 子查询

mysql> select name from teacher where id=(select t_id from t_s_r where s_id=(select id from student where name = "老李"));

+------+

| name |

+------+

| nike |

+------+

1 row in set (0.00 sec)

总结:

如何确认多对多的关系?

站在两个表的角度去想

处理方式,通过在两个表中间建立一个外键表,该外键表分别都关联两表的字段。

联合唯一约束

对于上面的t_s_r表进行改进

# 原表

create table t_s_r(

id int primary key auto_increment,

t_id int,

s_id int,

foreign key(t_id) references teacher(id),

foreign key(s_id) references student(id),

) charset utf8 ;

# 改进方法一(表已创建的情况下):unique key

alter table t_s_r add unique key(t_id,s_id);

# 改进方法二(表没创建的情况下):unique key

create table t_s_r(

id int primary key auto_increment,

t_id int,

s_id int,

foreign key(t_id) references teacher(id),

foreign key(s_id) references student(id),

unique key(t_id,s_id)

) charset utf8 ;

# 联合主键

create table t_s_r(

id int primary key auto_increment,

t_id int,

s_id int,

foreign key(t_id) references teacher(id),

foreign key(s_id) references student(id),

primary key(t_id,s_id)

) charset utf8 ;

对于上面的t_s_r表进行改进------最终版

# 创建学生表

create table student(

id int primary key auto_increment,

name char(10)

) charset utf8;

# 创建教师表

create table teacher(

id int primary key auto_increment,

name char(10)

) charset utf8;

# 创建学生和老师关系表

create table t_s_r(

t_id int,

s_id int,

foreign key(t_id) references teacher(id),

foreign key(s_id) references student(id),

primary key(t_id,s_id)

) charset utf8 ;

insert into teacher values(null,"bgon"),(null,"nike");

insert into student values(null,"老王"),(null,"老李");

# 老王被bgon教过

insert into t_s_r values(null,1,1);

# nike教过老李

insert into t_s_r values(null,2,2);

# nike教过老王

insert into t_s_r values(null,2,1);

# 问题:现在已知老师名称为bgon,请找出他教过的那些学生

mysql> select id from teacher where name="bgon";

+----+

| id |

+----+

| 1 |

+----+

1 row in set (0.00 sec)

mysql> select s_id from t_s_r where t_id=1;

+------+

| s_id |

+------+

| 1 |

+------+

1 row in set (0.00 sec)

mysql> select name from student where id=1;

+--------+

| name |

+--------+

| 老王 |

+--------+

# 整合查询语句:子查询

mysql> select name from student where id=(select s_id from t_s_r where t_id=(select id from teacher where name="bgon"));

+--------+

| name |

+--------+

| 老王 |

+--------+

1 row in set (0.00 sec)

# 问题:已知学生名为老李,请查询出哪些老师教过他.

mysql> select id from student where name = "老李";

+----+

| id |

+----+

| 2 |

+----+

1 row in set (0.00 sec)

mysql> select t_id from t_s_r where s_id=2;

+------+

| t_id |

+------+

| 2 |

+------+

1 row in set (0.00 sec)

mysql> select name from teacher where id=2;

+------+

| name |

+------+

| nike |

+------+

1 row in set (0.00 sec)

# 整合查询语句:子查询

mysql> select name from teacher where id=(select t_id from t_s_r where s_id=(select id from student where name = "老李"));

+------+

| name |

+------+

| nike |

+------+

1 row in set (0.00 sec)

一对一关系

例如:每一个人都有一个身份证。一个身份证只对应一个人

分表:

垂直分表,例如:人物的详细信息,就可以垂直分表

# 全表

create table person(

id int primary key auto_increment,

name char(10),

age int,

height float,

weigth float

)

# 垂直分表:person

create table person(

id int primary key auto_increment,

name char(10),

age int

) charset utf8;

# 垂直分表:person_info

create table person_info(

id int primary key,

height float,

weigth float,

foreign key(id) references person(id)

) charset utf8;

水平分表

数据量很大,使用一个表,查询效率低,使用两个表来存取这些数据

处理一对一关系处理方式:

先确定先后顺序

将先存在的数据作为主表

后存在的作为从表

使两个表的id保持一一对应

方法1:从表的id即是主键又是外键

方法2:从表的id设置为外键,并保证唯一

人物关系表,从客户演变为学生:

# 创建客户表

create table kehu_t(

id int primary key auto_increment,

name char(10),

phone char(11)

)

# 创建学生表

create table student_t(

id int primary key auto_increment,

card_id char(18)

)

为什么要分表:

数据分担在多个表,提高了查询的效率

mysql 关系_MySQL之关系相关推荐

  1. mysql 表结构关系_mysql 表关系 与 修改表结构

    mysql 表关系 与 修改表结构 两张表关系 多对一 以员工和部门举例 多个员工对应一个部门 foreign key 永远是在多的那张表中设置外键 """ 从左边的表思 ...

  2. mysql实体_mysql实体关系

    实体关系 表设计 1:1 两个实体表内,存在相同的主键字段 如果记录的主键值等于另一个关系表内记录的主键值,则两条记录的对应为一一对应 优化上称为垂直分割 1:n 一个实体对应多个其他实体(一个班级对 ...

  3. MySQL什么是关系_MySQL教程-关系模型

    MySQL教程-关系模型 Date 2021-1-22 Author Haihan Gao 什么是关系模型关系模型本质上就是多个存储数据的二维表 表的每一行称为记录 记录是一个逻辑意义上的数据 表的每 ...

  4. mysql中关系怎么弄_mysql数据库关系操作

    ### mysql数据库 #### 知识要点: 1. 数据操作增.删.改 2. 外键约束要求 3. 一对多表关系 4. 一对一表关系 5. 多对多表关系 6. 外键约束的参照操作 ### 数据操作 # ...

  5. mysql表和表的关系_mysql表与表之间建关系

    2.浪费硬盘空间 3.扩展性极差 上述的弊端产生原因类似于把代码全部写在一个py文件中,应该怎么做?  >> 解耦合! 将上述两张表拆成员工的部门两张表 分析表数据之间的关系:多个员工对应 ...

  6. mysql数据库性能跟哪些参数有关系_MySQL性能优化全攻略-服务器参数调整

    正确的编译方法固然重要,但它只是提高MySQL服务器性能工作的一部分.MySQL服务器的许多参数会影响服务器的性能表现,而且我们可以把这些参数保存到配置文件,使得每次MySQL服务器启动时这些参数都自 ...

  7. mysql什么是表的并的关系_MySQL表与表的关系

    表与表的关系 一对多关系 ID name gender dep_name dep_desc 1 Chen male 教学部 教书育人 2 Old flying skin male 外交部 漂泊游荡 3 ...

  8. MySql数据库三种关系详解

    如何分辨三种关系,以及三种关系的图列对比. 1.分析三种关系. 是否左表的多条记录可以对应右表的一条记录,是,则证明左表的一个字段 关联(foreign key)右表的一个字段(通常为ID) 是否右表 ...

  9. MYSQL 客户端与服务器关系

    数据库概念   如果想要知道mysql数据库客户端与服务器之间的关系.首先要明白什么是"数据库". 从字面意思理解,所谓"数据库",就是存放数据的库.现实中,大 ...

最新文章

  1. JVM最多支持多少个线程?
  2. asp.net 学习笔记 代码块标记
  3. android lcd工具,Android东西lcd配置
  4. 纠正网上流传的SQL取某一时间的当月第一天和最后一天的时间写法
  5. navicat连接远程mysql
  6. linux 32位平台,文件大小受限于2G的解决方法
  7. android自定义进度条百分比跟着走,Android自定义View实现水平带数字百分比进度条...
  8. 功能1 -- 顶部导航栏和返回顶部效果
  9. [2018.10.18 T3] 小 G 的线段树
  10. Java后端Controller层解析Json数组转对象
  11. 生物信息学初学——山大公开课笔记
  12. 维克多DBC文件结构
  13. EditPlus编码格式设置
  14. PLC:学习笔记(西门子)2
  15. 详析百度“原创保护”使用规范,及如何推送原创文章链接?
  16. Kindle PaperWhite 2越狱教程
  17. 安装redis时被意外攻击 newinit
  18. vue中echarts纵轴添加点击事件
  19. 扩展系统功能——装饰模式(四):透明与半透明装饰模式,装饰模式注意事项,装饰模式总结
  20. 看了这篇文章我才真正理解了!和快手大佬的技术面谈,附架构师必备技术详解

热门文章

  1. matlab程序设计图像匹配,灰度,归一化算法,快速匹配。有代码好用。转载
  2. python3有多少个关键字排序_python3 数据结构和算法-- 通过某个关键字排序一个字典列表...
  3. idea中没有j2ee_idea神器功能大全
  4. 自动化测试工具selenium python_Selenium自动化测试工具使用方法汇总
  5. html5新增的js,HTML5新增属性data-*和js/jquery之间的交互及注意事项
  6. 编译mediastreamer2/ffmpeg/linphone(x86平台)
  7. python最大正方形的面积_LeetCode 221. 最大正方形 | Python
  8. windows无法发现任何计算机或设备,Win10系统提示windows无法与设备或资源通信如何解决...
  9. 在日本山区流域使用支持向量机和 bagging、boosting 和 stacking 集成机器学习框架改进滑坡评估--文献阅读
  10. 【转】pthread mutex 基本用法