zoukankan      html  css  js  c++  java
  • 数据库——多表关系

    数据库——多表关系

    一对多表关系

    确定表与表之间的关系,一定要换位思考(必须两方都考虑周全之后才能得出结论)

    表1——>表2 一对多

    表2——>表1 多对一

    例如:一个部门有多个员工,而一个员工只有一个部门。此时部门表是主表,员工表是从表。

    员工表和部门表之间仅仅是单向的多对一,那么它们的关系就是"一对多",表关系中没有多对一一说,只有一对多(无论是多对一还是一对多都叫"一对多")

    # foreign key 外键约束,建立表与表之间的关系
    foreign  key(id)  references  biao(id)  # 外键约束,建立表之间的关系
    on delete cascade  # 级联删除,删除主表时,从表跟着删除
    # 建立表
    	* 先建立被关联的表,并且保证被关联的字段唯一
        * 再建关联的表:从表
    # 部门表
    create table dep(
    			id int primary key auto_increment,
    			dep_name varchar(32),
    			dep_desc varchar(128)
    		);
    
    # 员工表
    create table emp(
    			id int primary key auto_increment,
    			emp_name varchar(64),
    			emp_gender enum('male','female','others') default 'male',
    			dep_id int,
    			foreign key(dep_id) references dep(id)	
    		);		
    # 插入记录
    	* 先往被关联的表插入数据
        * 再往关联表插入记录
    insert into dep(dep_name,dep_desc) values('外交部','搞外交'),
    		('教学部','教书育人'),
    		('技术部','技术能力有限部门')
    		;
    insert into emp(emp_name,dep_id) values('jason',1),
    		('egon',2),
    		('tank',2),
    		('kevin',3);
    # 修改表数据
    	* 外键虽然能够帮你强制建立表关系,但是也会给表之间增加数据相关的约束
    update dep set id=200 where id = 1;  # 报错
    update emp set dep_id = 300 where id = 1;  # 报错		
    delete from dep where id = 3;  # 报错
    # 删除、更新数据
    	* 先删除、更新操作关联表
        * 再操作被关联的表
    delete from emp where id = 4;  # 先删除关联表
    delete from dep where id = 3;  # 再删除被关联表
    
    # 级联更新级联删除
        * 用了 on delete cascade、on update cascade就可以先操作被关联的主表
    create table dep(
    				id int primary key auto_increment,
    				dep_name varchar(32),
    				dep_desc varchar(128)
    			);
    create table emp(
    				id int primary key auto_increment,
    				emp_name varchar(64),
    				emp_gender enum('male','female','others') default 'male',
    				dep_id int,
    				foreign key(dep_id) references dep(id) 
    				on update cascade   # 同步更新
    				on delete cascade  # 同步删除
    			);
    insert into dep(dep_name,dep_desc) values('外交部','搞外交'),
    			('教学部','教书育人'),
    			('技术部','技术能力有限部门')
    			;
    insert into emp(emp_name,dep_id) values('jason',1),
    			('egon',2),
    			('tank',2),
    			('kevin',3);
    update dep set id=200 where id = 3;  # 修改一个表对应的那个表也改了
    delete from dep where id = 2;
    

    多对多表关系

    表1——>表2 多对多

    表2——>表1 多对多

    例如一个作者可以出多本书,而一本书也可以有多个作者。

    强调:foreign key只是用来帮你建表关系的,不是某个关系特有的方法

    # 创建多对多的关系(错误建法)
    # 书表
    create table book(
    				id int primary key auto_increment,
    				title varchar(32),
    				price int,
    				author_id int,
    				foreign key(author_id) references author(id)
    				on update cascade  # 同步更新
    				on delete cascade  # 同步删除
    			
    			);
    # 作者表
    create table author(
    				id int primary key auto_increment,
    				name varchar(32),
    				age int,
    				book_id int,
    				foreign key(book_id) references book(id)
    				on update cascade  # 同步更新
    				on delete cascade  # 同步删除
    			);
    
    # 注意上述的建法是错误的,多对多关系的建立,必须手动创建第三张表,用来专门记录两种表之间的关系
    # 因为建立表关系时,先建立被关联的表,再建关联的表。由于多对多关系的双方都是被关联的表和关联的表,所以无法建立。
    
    # 先建立两种普通的表,不需要设置外键(正确创建法)
    # 书表
    create table book(
    				id int primary key auto_increment,
    				title varchar(32),
    				price int
    			);  # 被关联的表
    # 作者表
    create table author(
    				id int primary key auto_increment,
    				name varchar(32),
    				age int
    			);  # 被关联的表
    
    create table book2author(
    				id int primary key auto_increment,
    				book_id int,
    				foreign key(book_id) references book(id)
    				on update cascade
    				on delete cascade,
    				author_id int,
    				foreign key(author_id) references author(id)
    				on update cascade
    				on delete cascade
    		);  # 关联的表(从表)
    insert into book(title,price) values('金瓶菊',199),('聊斋',299),('jason教你删别人的库,让别人跑去吧',1);
    insert into author(name,age) values('jason',18),('tank',38);
    insert into book2author(book_id,author_id) values(4,3);  # 报错
    insert into book2author(book_id,author_id) values(1,1),(1,2),(2,1),(3,1),(3,2);
    

    一对一表关系

    这种情况比较少见,因为一般的一对一,都不需要进行分表操作。

    但是当一个表中数据量太大的时候,为了提高效率,将一些不是很常用的数据拆分到另一个表中。称之为垂直分表。

    例如:人员表,和信息详情表

    # 人员表
    create table person(
        id int primary key auto_increment,
        name char(10)
        );
    
    # 详情表
    create table person_info(
        id int primary key,
        height float,
        weight float,
        foreign key(id) references person(id)
        );
    # 在这个例子中,必须先插入主表也就是person,拿到一个id,再添加详情表的数据,有点类似于多对一关系
    create table authordetail1(
    			id int primary key auto_increment,
    			phone int,
    			addr char(255)
    	
    	);
    
    create table author1(
    		id int primary key auto_increment,
    		name char(4),
    		age int,
    		authordetail_id int unique,
    		foreign key(authordetail_id) references authordetail1(id)
    		on update cascade
    		on delete cascade
    	);
    

    补充:垂直分表,水平分表

    垂直分表:把一个表的部分字段分到另一个表中

    水平分表:两个表的字段完全一致,只是把数据拆分开来提高效率。

  • 相关阅读:
    6. Flask请求和响应
    5. Flask模板
    FW:Software Testing
    What is the difference between modified duration, effective duration and duration?
    How to push master to QA branch in GIT
    FTPS Firewall
    Query performance optimization of Vertica
    (Forward)5 Public Speaking Tips That'll Prepare You for Any Interview
    (转)The remote certificate is invalid according to the validation procedure
    Change
  • 原文地址:https://www.cnblogs.com/zuihoudebieli/p/11385077.html
Copyright © 2011-2022 走看看