对于数据库表的设计,一般会有一对一,一对多,多对多,自关联四种情况。
一对一对象的表设计:做一个身份证管理系统,里面的人和身份证就是一对一的关系,主从关系,人拥有身份证,身份证属于人。只需要给人和身份证分别设计一张表,后再加关系,idcard
身份证的id
列设为外键约束。
设计人和身份证的表:
create table person
(
id int primary key,
name varchar(40)
);
create table idcard
(
id int primary key,
city varchar(40),
constraint id_FK foreign key(id) references person(id)
);
一对多或者多对一对象的表设计:假设做一个部门管理系统,从面向对象的角度考虑,要设计2个对象。department代表部门,员工对象employee。
不管对象引用关系,只管基本属性,根据基本属性建表。在多的一方加外键列描述数据之间的关系。
create table department
(
id int primary key,
name varchar(40)
);
create table 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)
);
多对多对象的表设计:一个老师可以有多个学生,一个学生可以有多个老师,同样地,只需要把老师teacher
和学生student
的相关属性用表描述出来,这个时候数据间的关系就要设计中间表teacher_student
。两列作为联合主键。加上外键约束。
create table teacher
(
id int primary key,
name varchar(40),
salary decimal(8,2)
);
create table student
(
id int primary key,
name varchar(40)
);
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)
);
还有一种设计方案,有的人会觉得设计3张表到时候查询会很麻烦,就设计成一张表,只是设计成一张表会造成数据的冗余。
自关联对象的表设计:一个家庭里有多个人,家族成员之间的关系是自关联的。
自连接的表
create table person
(
id int primary key,
name varchar(40),
parent_id int,
constraint parent_id_FK foreign key(parent_id) references person(id)
);