使用类别建模联合类型
在数据库管理系统中,超类/子类关系具有单个超类。共享子类可以在多个超类/子类关系中表示,其中每个关系都具有单个超类。
理解数据库管理系统中的超类/子类关系
使用多个超类的单个超类/子类关系。每个超类都表示不同的实体类型。子类表示对象组,它是不同实体类型联合的子集。此子类称为联合类型或类别。
示例
考虑以下场景:我们有三种不同的实体类型:PERSON、BANK 和 COMPANY。在机动车登记数据库中,车辆所有者可以归类为个人、持有车辆留置权的银行或公司。要创建一个包含所有三种实体类型的类(即实体集合),我们需要构建一个表示这三个集合的并集的子类,我们将其称为 OWNER。此子类是一个类别,也称为联合类型。
实体关系图中的类别
为了在实体关系 (EER) 图中直观地表示此子类,我们使用带“∪”符号的圆圈来表示集合联合运算,该运算连接到超类 COMPANY、BANK 和 PERSON。带子集符号的弧线将圆圈连接到 OWNER 类别,表明 OWNER 类别是这三种实体类型联合的子类。如有必要,我们可以在从超类到适用谓词的线的旁边显示定义谓词。
在下图中,我们可以看到 EER 图中显示的两个类别:OWNER 和 REGISTERED_VEHICLE。OWNER 是 PERSON、BANK 和 COMPANY 联合的子类,而 REGISTERED_VEHICLE 是 CAR 和 TRUCK 联合的子类。
类别和共享子类的比较:OWNER 和 ENGINEERING_MANAGER
类别是一个子类。它有两个或多个表示不同实体类型的超类。超类/子类关系仅具有单个超类。为了更好地理解类别与其他子类关系之间的区别,让我们将上图中的 OWNER 类别与共享子类 ENGINEERING_MANAGER 进行比较。
ENGINEERING_MANAGER 子类是以下每个超类的成员:ENGINEER、MANAGER 和 SALARIED_EMPLOYEE。属于 ENGINEERING_MANAGER 的实体也必须存在于其所有三个超类中。因此,ENGINEERING_MANAGER 是这三个类的交集的子集。工程经理必须是工程师、经理和正式员工。
另一方面,像 OWNER 这样的类别是其超类联合的子集。属于 OWNER 的实体必须存在于其超类之一中。在上图中,OWNER 实体可能是 COMPANY、BANK 或 PERSON。
属性继承适用于类别的情况。在上图中,每个 OWNER 实体都继承了 COMPANY、PERSON 或 BANK 的属性。它取决于实体所属的超类。在像 ENGINEERING_MANAGER(上图)这样的共享子类中,子类继承其超类 SALARIED_EMPLOYEE、ENGINEER 和 MANAGER 的所有属性。
总类别和部分类别
类别可以是总类别或部分类别。类别和共享子类(例如 ENGINEERING_MANAGER)之间的区别。在于后者必须存在于所有三个超类中。类别是其超类联合的子集。
类别可以是总类别。它包含其超类中所有实体的联合。类别也可以是总类别。它可以包含联合的子集。总类别由连接类别和圆圈的双线表示。部分类别由单线表示。
类别的超类可能具有不同的关键属性。这些可能具有相同的关键属性。如果类别是总类别,则可以将其表示为总专业化或总泛化。使用哪种表示的选择是主观的。如果这两个类表示相同类型的实体并共享大量属性。它也具有相同的关键属性,则首选专业化/泛化。否则,分类(联合类型)更合适。
需要注意的是,并非所有建模方法都具有联合类型。在这些模型中,必须间接表示联合类型。