14. 概念模型

概念模型

  • 概念模型是对真实世界中问题域内的事物的描述,不是对软件设计的描述
  • 当我们要完成一个系统时,需要把系统中的实体抽取出来,形成概念模型
  • 例如部门、员工都是系统中的实体,概念模型中的实体最终会成为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;

一对多建表

  • 少的一方是主表
  • 多的一方是从表
  • 从表维护主表,那么从表就应该有一个栏位指向主表的主键
  • dept表 -- 主表
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
  `deptno` int(11) NOT NULL,
  `dname` varchar(50) DEFAULT NULL,
  `loc` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • emp表 -- 从表
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
  `empno` int(11) NOT NULL AUTO_INCREMENT COMMENT '职工编号,主键',
  `ename` varchar(50) DEFAULT NULL COMMENT '职工姓名',
  `job` varchar(50) DEFAULT NULL COMMENT '工作',
  `mgr` int(11) DEFAULT NULL COMMENT '上级领导编号',
  `hiredate` date DEFAULT NULL COMMENT '入职时间',
  `sal` decimal(7,2) DEFAULT NULL COMMENT '工资',
  `COMM` decimal(7,2) DEFAULT NULL COMMENT '奖金',
  `deptno` int(11) DEFAULT NULL COMMENT '部门编号',
  PRIMARY KEY (`empno`),
  KEY `fk_emp` (`mgr`),
  KEY `deptno` (`deptno`),
  CONSTRAINT `emp_ibfk_1` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`) ON DELETE CASCADE,
  CONSTRAINT `fk_emp` FOREIGN KEY (`mgr`) REFERENCES `emp` (`empno`)
) ENGINE=InnoDB AUTO_INCREMENT=1020 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;
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容