14. 概念模型
2018-12-21 本文已影响47人
Liuzhl
概念模型
- 概念模型是对真实世界中问题域内的事物的描述,不是对软件设计的描述
- 当我们要完成一个系统时,需要把系统中的实体抽取出来,形成概念模型
- 例如部门、员工都是系统中的实体,概念模型中的实体最终会成为Java中的类(对象模型),数据库中的表(关系模型)
- 实体之间的关系分为:
- 1对1:例如老公和老婆,一个老公只能有一个老婆,一个老婆也只能有一个老公
- 1对多:例如部门和员工,一个部门可以有多个员工,一个员工只能从属于一个部门
- 多对多:老师与学生,一个老师可以有多个学生,一个学生也可以有多个老师
对象模型,类的关系
is a 关系,体现为继承
has a 关系, 体现为成员变量,双向关联
- 注意引用的是一个对象,而不是一个主键
- has a也就是关联关系,分为
- 1对1
public class Husband{ private Wife wife; } public class Wife{ private Husband husband; }
- 1对多
public class Dept{ private List<Emp> emps; } public class Emp{ private Dept dept; }
- 多对多
public class Teacher{ private List<Student> students; } public class Student{ private List<Teacher> teachers; }
use a 关系,体现为方法的参数
public class Person() {
public void write(Pen pen){
}
}
关系模型,数据库中的表的关系
- 在数据库中,表之间的关系用外键来维护
- 应该由数量多的来维护数量少的一方,也就是说数量少的一方为主表,数量多的一方为从表,外键应该由从表指向主表。
- 外键必须引用某张表的主键
- 外键可以重复
- 外键可以为空
- 一张表可以有多个外键
- 外键的命名为 fk_从表名_主表名
- 外键删除时或更新时有4个选项
- RESTRICT(默认的) / NO ACTION 表示在删除主表数据时必须满足条件:从表没有外键指向该数据了
- CASCADE 表示在删除主表数据时 同时删除从表中所有外键指向该数据的数据
- SET NULL 表示在删除主表数据时 将从表的外键设置为NULL
- 在Java中外键体现为在多方加入一个成员变量,类型为主表的主键类型。
一对一建表
- 一对一将哪张表作为主表都行,这里暂时以husband表作为主表
CREATE TABLE `husband` (
`h_id` int(11) NOT NULL AUTO_INCREMENT,
`h_name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`h_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 让wife表(从表)的主键作为外键指向husband的主键
CREATE TABLE `wife` (
`w_id` int(11) NOT NULL,
`w_name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`w_id`),
CONSTRAINT `aaa` FOREIGN KEY (`w_id`) REFERENCES `husband` (`h_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
多对多建表
- 多对多建表,2张表全是主表,然后建第3张表来作为中间表,中间表中应该有2个外键分别指向2张表
- 学生表
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`s_id` int(11) NOT NULL AUTO_INCREMENT,
`s_name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`s_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 教师表
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
`t_id` int(11) NOT NULL AUTO_INCREMENT,
`t_name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`t_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 中间表
DROP TABLE IF EXISTS `teacher_student`;
CREATE TABLE `teacher_student` (
`tea_stu_id` int(11) NOT NULL AUTO_INCREMENT,
`fk_stu` int(11) DEFAULT NULL,
`fk_tea` int(11) DEFAULT NULL,
PRIMARY KEY (`tea_stu_id`),
KEY `ccc` (`fk_stu`),
KEY `ddd` (`fk_tea`),
CONSTRAINT `ccc` FOREIGN KEY (`fk_stu`) REFERENCES `student` (`s_id`),
CONSTRAINT `ddd` FOREIGN KEY (`fk_tea`) REFERENCES `teacher` (`t_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;