1、概念模型
当我们要完成一个软件系统时,需要把系统中的实体抽取出来,形成概念模型。概念模型在Java中称为实体类,实体类--是与数据库中的表对应的,一种orm(对象与关系的映射);实体类在Java中的体现形式就是javaBean(所以说javabean是实体类的一种)。
类使用成员变量来完成关系,一般都是双向关联!例如部门、员工都是系统中的实体。概念模型中的实体最终会成为Java中的类、数据库中表。实体之间也存在着关系,关系有三种:一对多、多对多和一对一。
2、Java中的概念模型
● 一对多:
例如每个员工都从属一个部门,而一个部门可以有多个员工,其中员工是多方,而部门是一方,如下:
class Employee {//多方关联一方
...
private Department department;
}
class Department {//一方关联多方
...
private List<Employee> employees;
}
● 一对一:
例如丈夫和妻子就是一对一的关系,一个丈夫只能有一个妻子,而一个妻子只能有一个丈夫,如下:
class Husband {
...
private Wife wife;
}
class Wife {
...
private Husband;
}
● 多对多:
老师与学生的关系就是多对多,一个老师可以有多个学生,一个学生可以有多个老师。
class Student {
...
private List<Teacher> teachers
}
class Teacher {
...
private List<Student> students;
}
2、数据库中的概念模型
数据库中的概念模型称为表,表之间的关系:
● 一对多:
最为常见的就是一对多!一对多和多对一,这是从哪个角度去看得出来的。emp和dept的关系,从dept来看就是一对多,而从emp的角度来看就是多对一!这种情况都是在多方创建外键:
/*部门表*/
create table dept (
deptno int primary key,/*部门编号*/
...
);
/*员工表*/
create talbe emp (
empno int primary key,
...
deptno int,
CONSTRAINT fk_emp FOREIGN KEY(mgr) REFERENCES emp(empno)
);
● 一对一:
丈夫和妻子是一对一的关系,在表中建立一对一关系比较特殊,需要让其中一张表的主键,即是主键又是外键。如下:
create table husband(
hid int PRIMARY KEY,
...
);
create table wife(
wid int PRIMARY KEY,
...
ADD CONSTRAINT fk_wife_wid FOREIGN KEY(wid) REFERENCES husband(hid)
);
其中wife表的wid即是主键,又是相对husband表的外键!husband.hid是主键,不能重复,wife.wid是主键,不能重复,又是外键,必须来自husband.hid。所以如果在wife表中有一条记录的wid为1,那么wife表中的其他记录的wid就不能再是1了,因为它是主键。同时在husband.hid中必须存在1这个值,因为wid是外键。这就完成了一对一关系。
● 多对多:
例如t_stu和t_teacher表,即一个学生可以有多个老师,而一个老师也可以有多个学生。这种情况通常需要创建中间表来处理多对多关系,即需要三张表,在中间表中使用两个外键,分别引用其他两个表的主键:
create table student(
sid int PRIMARY KEY,
...
);
create table teacher(
tid int PRIMARY KEY,
...
);
create table stu_tea(
sid int,
tid int,
ADD CONSTRAINT fk_stu_tea_sid FOREIGN KEY(sid) REFERENCES student(sid),
ADD CONSTRAINT fk_stu_tea_tid FOREIGN KEY(tid) REFERENCES teacher(tid)
);
这时在stu_tea这个中间表中的每条记录都是来说明student和teacher表的关系,而两个外键都是可以重复的,这样就完成了多对多:
sid tid
101 201 /*编号为101的学生有一个编号为201的老师*/
101 202 /*编号为101的学生有一个编号为202的老师*/
102 201 /*编号为102的学生有一个编号为201的老师*/
小结:概念模型是对真实世界中问题域内的事物的描述,可以发现表描述概念模型是没有javabean描述的清晰的,尤其是在多对多的描述上。