复杂类型的对象有几种表现形态:
- 一对一
- 一对多或多对一
- 多对多
一对多或多对一的对象存到数据库表的设计方案
以部门和员工的关系来说明一对多或多对一的对象是怎么存储到数据库表中的。
数据库表的设计的原则:先不要去管这些对象的关系,看某个对象有什么基本属性,然后设计一个表来保存此对象的基本数据。在数据库里面怎么去保证数据往数据库里面存的时候,关系不丢呢?这里面有一个原则,记住一句话——在多的一方加外键描述数据之间的关系。
数据库表的设计方案如下:
数据库表的SQL语句如下:
-
department表
create table department ( id int primary key, name varchar(40) );
- 1
- 2
- 3
- 4
- 5
-
d_employee表
create table d_employee ( id int primary key, name varchar(40), salary decimal(8,2), department_id int, constraint department_id_FK foreign key(department_id) references department(id) );
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
多对多对象的表的设计
以老师和学生的关系来说明多对多的对象是怎么存储到数据库表中的。
数据库表的设计的原则:先不要去管这些对象的关系,看某个对象有什么基本属性,然后设计一个表来保存此对象的基本数据。在数据库里面怎么去保证数据往数据库里面存的时候,关系不丢呢?需要加一个中间表来描述数据的关系。
数据库表的设计方案如下:
数据库表的SQL语句如下:
-
teacher表
create table teacher ( id int primary key, name varchar(40), salary decimal(8,2) );
- 1
- 2
- 3
- 4
- 5
- 6
-
student表
create table student ( id int primary key, name varchar(40) );
- 1
- 2
- 3
- 4
- 5
-
teacher_student表(中间表)
create table teacher_student ( teacher_id int, student_id int, primary key(teacher_id,student_id), constraint teacher_id_FK foreign key(teacher_id) references teacher(id), constraint student_id_FK foreign key(student_id) references student(id) );
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
注意:关于中间表的设计,在设计主键时,应将teacher_id,student_id这2列作为联合主键,即这2列值加在一起不能重复。
一对一的对象的数据库设计
以身份证管理系统来说明一对一的对象是怎么存储到数据库表中的。
数据库表的设计的原则:先不要去管这些对象的关系,看某个对象有什么基本属性,然后设计一个表来保存此对象的基本数据。一对一的对象有一个主从关系,主可以没有从,但从不能没有主。在身份证管理系统中,一对一的关系表现为一个人只能有一张身份证,一张身份证只能属于一个人;主是人,从是身份证,一对一的对象有一个主从关系表现为人可以没有身份证,但身份证不能不属于人。
数据库表的设计方案如下:
数据库表的SQL语句如下:
-
person表
create table person ( id int primary key, name varchar(40) );
- 1
- 2
- 3
- 4
- 5
-
idcard表
create table idcard ( id int primary key, city varchar(40), constraint id_FK foreign key(id) references person(id) );
- 1
- 2
- 3
- 4
- 5
- 6
自连接表的设计
以家族管理系统来说明自连接表的设计。
数据库表的设计方案如下:
注意:自连接,外键列不能加非空约束。
数据库表的SQL语句如下:
-
person表
create table person ( id int primary key, name varchar(40), parent_id int, constraint parent_id_FK foreign key(parent_id) references person(id) );
- 1
- 2
- 3
- 4
- 5
- 6
- 7
面试题:一个无限极分类的数的数据库表的设计(请设计一个无限极分类的表)。
解:以一个商品分类表来说明怎样去设计一个无限极分类的表。这里用图来说明:
总结
如果不使用数据库的三大范式建表,而是设计一张表,把所有数据存到一张表里,那么会出现冗余数据,但是查询性能很好,不需要查多表。
例如,在多对多对象的表的设计中,我们可以设计一张表,把所有数据存到一张表里。