个人觉得在软件的设计时,先对需求进行把控,然后根据需求画出UML类,最后才是数据库的设计。根据对象设计表结构。(这种想法不一定对)
接下来说说关系型数据库实体之间的三种关系:
一、一对一关系
比如:中国的夫妻制、人和身份证之间。针对这种关系,我们应该如何进行数据库表的设计呢?
首先我们需要明确这一对关系的主从关系。不确定主从关系的话,应该根据具体的需求而定。拿人和身份证之间的关系距离。人不一定有身份证(超生的黑人),但是身份证一定对应某个人,除非这个证是假的。那么,从属关系就很明确了。“人”是主,“身份证”是属。针对这种关系,我们将外键定义在身份证对应的实体中,参照到“人”的主键。
"人"表
create table person
(
id int primary key auto_increment,
name varchar(20),
.....
)
"身份证"表
create table idcard
(
id int primary key auto_increment,
name varchar(20),
personid int not null,
constraint personid _fk foreign key(personid ) references person(id)
)
二、多对一关系
如果关系是多对一的话,为了避免数据的冗余。应该将外键定义在“多”的一方。比如班级表和学生表之间的关系。一个班级对应多个学生,一个学生只能在一个班级中,
所以,外键定义在学生表中,参照到班级表中的主键。
班级表:
create table class
(
id int primary key auto_increment,
name varchar(20)
)
学生表:
create table student
(
id primary key,
name varchar(20),
classid id not null,
constraint classid _fk foreign key(classid ) references person(id)
)
三、多对多关系
如果是多对多的关系,相对比较复杂一下。外键定义在哪儿都会导致数据的冗余。所以将两者之间的关系定义在中间表中。这个中间表的联合主键就是
另外两个表的外键。
老师表:
create table teacher
(
tid int primary key,
.....
)
学生表:
create table student
(
sid int primary key,
....
)
中间表:
create table tea_stu
(
tid int not null,
sid int not null,
primary key (tid,sid), -- 联合主键
constraint tid_fk foreign key(tid ) references teacher(tid),
constraint sid_fk foreign key(sid ) references student(sid)
)
以上就是根据实体关系,进行表结构设计的方法。