Chapter 6.8 ISA

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 等字段。
  • 优点: 查询特定子类型的数据时速度快。
  • 缺点:
    • 数据冗余(如果一个人既是学生又是员工,他的nameage信息会在两张表中重复存储)。
    • 难以对所有人进行统一查询(需要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
  • 优点:
    • 设计规范,消除了数据冗余。
    • 易于添加新的子类型。
    • 能很好地支持重叠约束(一个人可以同时在StudentsEmployees表中有记录)。
  • 缺点: 查询数据时需要频繁使用JOIN操作,性能可能成为瓶颈。

总结

在数据库领域中,ISA Relationship 是一个强大的概念建模工具,它清晰地表达了 “是一个” 的继承关系。理解并正确定义其重叠约束完备性约束至关重要,因为它直接影响到最终数据库表结构的设计选择(每种实现方式都有其优缺点,需要根据具体应用场景进行权衡)。

Built with Hugo
Theme Stack designed by Jimmy