实体集(Entity Sets)
- 是实际存在的事物(可以是抽象的)
- 具有属性(attributes)
- 实体集是具有共同性质的同类实体的集合
实体集的属性类型划分
- 简单的和复合的(conposite,如名字等等)
- 单值的/多值的(如电话号码等)
- 直接的/派生的(可以由其他属性计算得来,如生日等)
关系集(待补充)
E-R图
- 矩形代表实体集,上方为名字,下方是属性,主键用下划线标出
- 菱形代表关系集
- 线段连接实体集和关系集
- 虚线连接一个关系集和它的描述属性
- 双线表示实体集对于关系集的全参与
- 双菱形表示与一个弱实体集联系的鉴别关系集
角色关系
自环联系集是一种角色关系集,它建立在一个实体集上:
基数约束
有两种表示基数约束的方法:使用箭头与线段或者使用数字标注的线段
- 一对一关系:
两侧都使用箭头,如上如的规定:一名学生只能有一位导师,一位导师也只能教导一名学生。 - 一对多关系
箭头指向单参与(或者说不会多个对应一个)的实体集,表示一名导师可以教导多个学生,但一个学生只能选取一个老师。 - 多对一联系(同上项理)
- 多对多联系
应当注意到,没有声明全参与时,一名导师可能不教导学员,一名学生也可能不会选取导师(适用于以上任何一种情况)
参与约束
- 全参与(Total participation ):双线,表示某个实体集的所以元素都参加了对应的关系集
- 部分参与(partial participation):与之相反
- 其他用于表示的方法:在线段上添加数字:
如下图:
导师的线段上标注了其对应的学生是0~,其中以0为下限意味着instructor之于advisor是部分参与,而没有上限意味着导师1个导师可以对应多个学生(但这并不意味着整个关系是1对多);而学生部分以1为下限意味着学生必须是全参与,又以1为上线意味着1名学生有且仅有1位导师,它和之前的条件共同确定了整个关系是个1对多关系。
将非二元关系转化为二元关系形式
有些关系集本身并不能切分成若干个二元关系集,如
导师指导学生进行某个项目的相关工作,这很难分为若干个二元关系集而不损失本身的性质,所以需要一些技术进行转换。
另一个例子:
图中存在一个四元的关系集,而上面的方法没有强行分解四元集,而是以course为中心,建立三个二元关系将实体集串联起来。
可以看到,这种问题的通式是从实体集中寻找有代表性者,或者创建一个新的鉴别性的实体集,之后以它为中心构建连接其他实体集的二元关系集,另一种想法如下:
弱实体集
弱实体集指不存在主键的实体集。
这样的集合是有意义的,因为对于一些实体,他们的任何属性都有可能重复出现,如section(sec_id,semester,year)
,对于某项课程,课程在不同学期和学年都可能开课,而学期和学年更是会大量重复的属性。但是这三个属性却又唯一确定一门课程,此时需要引入与弱实体集和标识实体集相关的内容来表示这样的关系。
可以明确的是,所有弱实体集都依托于某个其他实体而存在,我们称之为标识实体集(identifying entityset),他们通过标识性关系(identifying relationship)连接,这一关系集的性质如下:
- 弱实体集一侧是全参与
- 是一对多的关系,一条标识实体集中的元组可能对应多条弱实体集中的元组
- 弱实体集中存在分辨符(discriminator)或部分码(partial key)
部分码的存在是由对应的标识实体集决定的,部分码可以唯一确定对应于标识实体集的一条唯一记录(在上述section例子中,section的三个属性一同构成了部分码),这也意味着标识实体集的主键+部分码才构成了弱实体集的主键。
示意图如下:
扩展的实体-关系特性
实体集的层次(stratum)
层序结构以为着两种字面意义上的操作:
- 具体化(Specialization):类似于类继承操作,子实体从高级实体继承属性并添加自己的属性,他们能参加高级实体参加的关系,但也参加高级实体无法参加的关系
- 泛化(Generalization):自底向上的过程,类似于从类似的类中抽象出接口/父类
事实上,具体化与泛化仅仅只是简单的互逆操作。我们往往用可交性来描述这样的层序结构:
我们可以用disjoint对一个泛化模型进行描述,来表示它的泛化子集不会有重叠;如果没有disjoint,则意味着可能有重叠。
和关系集一样,泛化操作也有完全参与与部分参与之分,完全泛化也使用双线表示
E-R模型标记总结: