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