多表关系主要可以分三种:
1.一对一关系
2.多对一关系(如:员工与部门)
3.多对多关系(如:老师与学生)
在mysql中建立这样的关系型多表的一般方案如下:
一、一对一关系
可以建立一个主表和一个副表,将数据量多的作为主表,其有自己id号作为主键,并有副表的id做为外键,
也可以直接将他们设计成一个表。
二、多对一关系
各建立一张表,多的表加上外键约束,建标语句如下:
CREATE TABLE department( id varchar(30) PRIMARY KEY, name varchar(30) ); CREATE TABLE employee( id varchar(30), name varchar(30), salary double, department_id varchar(30), PRIMARY KEY(id), CONSTRAINT department_id_FK FOREIGN KEY(department_id) REFERENCES department(id) ON DELETE SET NULL );
三、多对多关系
在建立两张基本信息表的同时,建立一个中间表,这个中间表通过两个键值来表达两个表的数据关系,见表语句如下:
CREATE TABLE teacher( id varchar(30) PRIMARY KEY, name varchar(30), salary double ); CREATE TABLE student( id varchar(30) PRIMARY KEY, name varchar(30) ); CREATE TABLE teacher_student ( teacher_id varchar(30) NOT NULL DEFAULT "", student_id varchar(30) NOT NULL DEFAULT "", PRIMARY KEY (teacher_id,student_id), CONSTRAINT student_id_FK FOREIGN KEY (student_id) REFERENCES student (id) ON DELETE CASCADE, CONSTRAINT teacher_id_FK FOREIGN KEY (teacher_id) REFERENCES teacher (id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
四、总结
表中行的信息是通过id来标识的,多表的关系总是通过建立一个各个表的id映射来表达,这个映射表有时比较简单,就把它包含到其要映射的一个表中(如多对一关系表),而比较复杂时就单独提取出来(如多对多关系表),当然也可以不提取出来,但是那样设计会产生很多冗余空间,占用我们硬盘。
但是我们要查询这些表时,将映射表提取出来的设计在这个时候就明显不如不提取出来的设计,因为多表查询总是比单表查询更耗费时间,所以为了节约查询时的成本我们有时候会把多表合并设计,其实就是提前求出了多表的笛卡儿积。
把表分开节约空间,把表合并节约时间,所以具体表该怎么设计还是要看需求。