路飞学城Python-Day96
51-数据库表关系之一对多
为什么有多表的概念?
一个Book有单表的时候只能查询Book表中的内容,要想查询更多的出版社的信息,需要再将单表的内容不断更新
导致单表会存储大量的重复的信息,浪费了大量的空间,字段越多,重复的内容也会越来越多
一对多的后果
Book表
|
|
|
|
id
|
title
|
price
|
publish
|
1
|
php
|
100
|
人民出版社
|
2
|
python
|
200
|
沙河出版社
|
3
|
go
|
100
|
人民出版社
|
4
|
java |
300
|
人民出版社
|
Book
|
|
|
|
|
|
id
|
title
|
price
|
publish
|
email
|
addr
|
1
|
php
|
100
|
人民出版社
|
111
|
北京
|
2
|
python
|
200
|
沙河出版社
|
222
|
沙河
|
3
|
go
|
100
|
人民出版社
|
111
|
北京
|
4
|
java
|
300
|
人民出版社
|
111
|
北京
|
一对多的实现:
查询python这本书的出版社的邮箱(子查询)
select publish_id from Book where title = "python";
select email from Publish where id = 1;
Book
|
|
|
|
id
|
title
|
price
|
publish_id
|
1
|
php
|
100
|
1
|
2
|
python
|
200
|
1
|
3
|
go
|
100
|
2
|
4
|
java
|
300
|
1
|
Publish
|
|
|
|
id
|
name
|
email
|
addr
|
1
|
人民出版社
|
111
|
北京
|
2
|
沙河出版社
|
222
|
沙河
|
一旦确定表的关系是一对多的时候,就创建关联字段,关联字段需要创建在多的那张表里
52-数据库表关系之多对多
Author
|
|
|
|
id
|
name
|
age
|
addr
|
1
|
alex
|
34
|
beijing
|
2
|
egon
|
55
|
nanjing
|
Book2Author
|
|
|
id
|
book_id
|
author_id
|
1
|
2
|
1
|
2
|
2
|
2
|
查询alex出版过的书籍名称
select id from Author where name = "alex"
select book_id from Book2Author where author_id = 1
select title from Book where id = book_id
总结:一旦确定表的关系是多对多,一定要创建第三章关系表,就是三个字段,主键id+表1字段+表2字段
53-数据库表关系之一对多一
一对一的关系必须有抽离出的表
Author
|
|
|
|
id
|
name
|
age
|
Authordetail_id(unique)
|
1
|
alex
|
34
|
1
|
2
|
egon
|
55
|
2
|
AuthorDetail
|
|
|
|
|
id
|
addr
|
gender
|
tel
|
gf_name
|
1
|
beijing
|
male
|
110
|
小花
|
2
|
nanjing
|
male
|
911
|
小娘
|
所谓的一对一本质上就是可以放在一个表里,有的时候为了逻辑关系或者表的结构的整洁,就需要解耦这种关系表
总结:一旦确定是一对一的关系,在两张表的任意一张表中建立关联字段+Unique
54-数据库表关系之关联字段与外键约束
一对多表如果互相之间没有关系的话,一般建立关联字段的时候就要建立表之间的约束关系,建关联字段是为了查询,建关联关系约束是为了处理未来可能出现的脏数据
55-数据库表关系之sql创建关联表
1.Publish
CREATE TABLE publish(
id INT PRIMARY KEY auto_inctrment ,
name VARCHAR(20),
);
CREATE TABLE book(
id INT PRIMARY KEY auto_inctrment ,
title VARCHAR(20),
price DECIMAL(8,2),
pub_date DATE,
publisg_id INT,
FOREIGN KEY (publish_id)REFERENCES publis(id),
);
CREATE TABLE authordetail(
id INT PRIMARY KEY auto_increment,
tel VARCHAR(20),
);
4.Author
CREATE TABLE authordetail(
id INT PRIMARY KEY auto_increment,
name VARCHAR(20),
age INT,
authordetail_id INT UNIQUE,
FOREIGN KEY (autoordetail_id) REFERENCES authordetail(id),
);
CREATE TABLE book2author(
id INT PRIMARY KEY auto_increment,
book_id INT,
author_id INT,
FOREIGN KEY (book_id) REFREENCES book(id),
FROEIGN KEY (author_id) REFERENCES author(id),
);
Win a contest, win a challenge
posted on 2018-10-05 09:31 pandaboy1123 阅读(188) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南