ISA关系(6.8)
ISA Relationship 指的是一种特定的数据建模技术,用于在概念模型(如ER图)中表示实体之间的继承关系。
ISA 是 “IS-A” 的缩写,例如 “A Manager IS-AN Employee”(一个经理 是 一个员工)。它描述了一种父类型(超类型) 和子类型 之间的层次关系。
核心概念
在数据库设计中,ISA关系用于捕捉现实世界中存在的分类结构。
- 超类型 / 父类: 一个更一般化、更抽象的实体。
- 例如:
人(Person)、账户(Account)、车辆(Vehicle)
- 例如:
- 子类型 / 子类: 一个更具体、更特化的实体,它是超类型的一种。
- 例如:
员工(Employee)和学生(Student)是人(Person)的子类型。 储蓄账户(SavingsAccount)和支票账户(CheckingAccount)是账户(Account)的子类型。
- 例如:
ISA关系的两个关键约束
当你在设计中使用ISA关系时,必须定义两个重要的约束:
1. 重叠约束(Disjoint/Overlapping Constraint)
规定一个超类型的实例是否可以同时属于多个子类型。
- 不允许重叠: 一个超类实例只能属于一个子类型。
- 例如:一个
账户(Account)要么是储蓄账户(SavingsAccount),要么是支票账户(CheckingAccount),但不能同时是两者。用 “OR” 表示。
- 例如:一个
- 允许重叠: 一个超类实例可以同时属于多个子类型。
- 例如:一个
人(Person)可以同时是员工(Employee)和学生(Student)。用 “AND” 表示。
- 例如:一个
2. 完备性约束(Completeness constraint)
规定超类型中的每一个实例是否都必须至少属于一个子类型。
- 全完备性(total): 超类型的每一个实例都必须是某个子类型的实例。
- 例如:公司规定,每一个
员工(Employee)都必须是小时工(HourlyEmployee)或月薪工(SalariedEmployee)中的一种。超类型员工(Employee)不会存在不属于任何子类的“孤例”。在ER图中,用双线表示。
- 例如:公司规定,每一个
- 部分完备性(partial): 超类型的实例可以不属于任何子类型。
- 例如:一个
人(Person)可以只是普通人,既不是员工(Employee),也不是学生(Student)。在ER图中,用单线表示。
- 例如:一个
在数据库中的实现方式
ISA层次结构在物理数据库中主要有三种实现方式:
1. 每个具体类一张表
- 方法: 忽略超类型,只为每个子类型创建一张表。这张表包含该子类型特有的属性,以及从超类型继承来的所有属性。
- 举例: 创建
学生表(Students)和员工表(Employees),没有人表(Persons)。Students表中有student_id, name, age, major等字段。 - 优点: 查询特定子类型的数据时速度快。
- 缺点:
- 数据冗余(如果一个人既是学生又是员工,他的
name和age信息会在两张表中重复存储)。 - 难以对所有人进行统一查询(需要
UNION操作)。 - 无法表示不属于任何子类的人。
- 数据冗余(如果一个人既是学生又是员工,他的
2. 单张表
- 方法: 将整个层次结构“扁平化”为一张表。这张表包含超类型和所有子类型的所有属性。同时,增加一个“类型鉴别”字段来标识每一行属于哪个子类型。
- 举例: 创建一张
人表(Persons),包含字段:person_id, name, age, person_type, major, salary, department。- 如果
person_type = ‘Student’,那么major字段有意义,salary字段为NULL。 - 如果
person_type = ‘Employee’,那么salary字段有意义,major字段为NULL。
- 如果
- 优点: 统一查询非常简单,不需要
JOIN操作。 - 缺点:
- 表中存在大量
NULL值,浪费存储空间。 - 表结构会随着子类型的增加而变得非常庞大和复杂。
- 表中存在大量
3. 超类型和子类型分别建表
- 方法: 为超类型和每一个子类型都创建一张表。
- 超类型表包含所有实例共享的公共属性(和一个主键)。
- 子类型表只包含其特有的属性,并共享超类型表的主键(即子类型表的主键同时也是引用超类型表的外键)。
- 举例:
人表(Persons):person_id (PK), name, age学生表(Students):person_id (PK, FK references Persons), major员工表(Employees):person_id (PK, FK references Persons), salary, department
- 优点:
- 设计规范,消除了数据冗余。
- 易于添加新的子类型。
- 能很好地支持重叠约束(一个人可以同时在
Students和Employees表中有记录)。
- 缺点: 查询数据时需要频繁使用
JOIN操作,性能可能成为瓶颈。
总结
在数据库领域中,ISA Relationship 是一个强大的概念建模工具,它清晰地表达了 “是一个” 的继承关系。理解并正确定义其重叠约束和完备性约束至关重要,因为它直接影响到最终数据库表结构的设计选择(每种实现方式都有其优缺点,需要根据具体应用场景进行权衡)。