ER图数据建模
ER图也称为:
实体关系图, 实体类型,属性和关系的方法,用来描述 现实世界的概念模型。

-
实体类:用矩形表示。
-
属性:用椭圆表示。
-
主键字段 用下划线标记出来。
ER图和用例图区别

左边ER图除了学生实体之外,我还添加了成绩实体,这个成绩实体包括了考试成绩的编号,还有参加考试同学的学号,考试的分数以及考试的科目这些属性,那么同学们请看成绩和学生这两个实体之间是有关系的,我用一个菱形连接了这两个实体,那么学生是拥有考试成绩的,将来我们在创建学生表和成绩表的时候,菱形对应的就是外键约束了,建表就有依据
右侧用例图表现的是用户和功能之间的关系,比如说有一个在线教育的系统,那么普通用户能在这个系统上去咨询课程,查看课程,购买课程、在线学习,还有对课程进行评价,这些都是普通用户所具有的功能。还有一个从普通用户派生出来的一个新的角色叫做管理员,那么这种用户他在使用在线教育系统的时候,从普通用户这里继承了很多的功能,接下来管理员的用户所具备的独有的功能,咱们来看一下在用例图里边单独画了一下,就是拥有课程管理,还有教师管理这些功能。所以一看到用力图我们就明白将来我们要开发的在线教育系统有什么样的功能,那么哪些角色哪些用户能使用这个系统里边的什么功能,在用例图里边表现得一清二楚。
那么用力图是不能表现实体的属性,它表现的是实体的功能,
- ER 图表现实体的属性
- 用例图表现系统功能
ER图属性语法(复合属性,多值属性,派生属性)

-
复合属性是多个属性的组合(如图工号)
-
多值属性用双椭圆表示(如图角色)
-
派生属性是不保存在实体中的属性用虚椭圆表示(如图人数)
-
可选属性是允许有没有值的属性
多值属性举例
如图表所示,那么一个员工他可以具备多个角色,比如说一个人可以同时拥有员工和质检员这两种角色,当我们画角色属性的时候,就要用双边框线给它标注出来,其实像角色这样的多值属性还是有很多的,比如说一个人可以有多个电话号码,那么电话字段就是多值属性,我们在设计数据表的时候定义多值属性的字段,最简单的做法就是把这样的字段定义成varchar类型的,然后里边的数据用逗号给分开,就能实现保存多值的内容了,再或者用买MySQL引入的新数据类型,把数据写成json,保存到某一个字段上,来形成多值属性也是可以的,而且同学们也不用担心mysql提供了多种操作Jess字段的函数,甚至 json字段还可以支持索引机制,如果是这样的话,同学们可以完全抛弃用varchar字段来保存多值数据的这种做法了,使用json数据类型是一个非常好的办法。
ER图实体关系语法
ER图一对一关系

员工和办公电脑之间就应该是一对一的关系,为了表现出这种一对一的关系,我们在两个实体之间连上了一个菱形,因为员工可以使用电脑,所以菱形里边的文字就为使用,菱形的两侧分别选上了数字一,那么就代表说员工和办公电脑这两个实体是一对一的一个映射关系。菱形的上方就是实体之间的关联属性,在创建数据表时,员工表和办公电脑表通过 员工编号相关联。
一对一关联属性归属问题
为什么不在员工实体里面创建一个电脑编号的属性?
一个员工可以领取的物品是有很多的,如果说我们在员工表里面创建了很多领用物品的字段,那么这个员工表看起来就非常的复杂,如果说我们在办公电脑这个表里边添加了一个员工编号的字段,其实对这个表没有什么影响对吧?所以说各种领用,物品的表都应该具有员工编号这样的属性,而不是反过来让员工具有物品编号的属性
ER图是一对多关系

班级和学生这两个实体之间就是一对多的关系,那么一个班级可以对应多个学生,那么这些学生是隶属于同一个班级的,你看我还是用菱形把两个实体给连接起来了,那么班级这边是数字1学生,这边是数字n这个就清晰地表达出一对多的关系。
一对多关联属性归属问题
班级编号属性应该属于班级实体还是应该属于学生实体?
当然是属于学生实体了,如果说属于班级实体的话,那么需要在班级实体里边去定义每一个同学的学生编号,在班级的实体里边也非常不好维护这么多的字段,因此说我们需要把关联的属性定义到学生实体里面,那么将来我们在创建外界约束的时候,就是在学生表里边定义外键约束
ER图是多对多关系

图里边定义了员工和角色两个实体,那么一个员工可以对应多个角色,一个角色也可以对应多个员工,因此说两个实体之间就是多对多的关系。在这里面我还是用菱形连接了两个实体,一边写上字母n另外一边写上了字母m这就代表多对多的关系了。
多对多关联属性归属问题
然后我们还得找出两个实体的关联属性,这个就比较复杂了,因为两边都是多对多,我在员工实体里边不可能去定义每一个角色的编号属性,那么我在角色实体里边也不可能定义每一个员工边好的属性,所以两个实体里边我们都无法定义关联的字段,那么接下来我们应该怎么办?
其实也非常好解决,那就是新创建一个关系表,来保存员工编号和角色编号的对应关系,因为员工编号和角色编号都不是主键字段,所以数据是可以重复的,比如说我们可以用一条员工编号和一个角色编号代表一个对应关系,那么我定义相同的员工编号的记录,但是对应的是不同的角色编号,这样子定义出多个纪录之后,就代表说一个员工编号对,用多个角色编号的关系了,那么反过来也是这样子,我可以用同一个角色编号去关联多个员工编号,这样子多条数据保存下来以后就可以实现一个角色对多个员工了,那么各位同学以后再遇到多对多的关系,我们一定要创建关系表才能解决这个问题。