让我们从概念层面开始。如果我们将医院、诊所、学校和大学视为主题实体的类,是否存在概括所有这些的超类?大概有。我不会试图告诉你它是什么,因为我不像你那样理解你的主题。但是我将继续进行,好像我们可以将它们都称为“机构”,并将这四个中的每一个都视为机构的子类。
正如其他响应者所指出的,类/子类扩展和继承并未内置到大多数关系数据库系统中。但是,如果您知道正确的流行语,就会有很多帮助。以下内容旨在用数据库术语向您介绍流行语。这里是对即将到来的流行语的总结:“ER 泛化”、“ER 专业化”、“单表继承”、“类表继承”、“共享主键”。
停留在概念级别,ER 建模是在概念级别理解数据的好方法。在 ER 建模中,有一个概念“ER 泛化”和一个对应的概念“ER 专业化”,它们与我刚刚在上面作为“超类/子类”提出的思维过程平行。ER 专业化告诉您如何绘制子类,但不会告诉您如何实现它们。
接下来我们从概念层面向下移动到逻辑层面。我们用关系或 SQL 表来表达数据。有几种实现子类的技术。一种叫做“单表继承”。另一种称为“类表继承”。与类表继承有关,还有另一种名为“共享主键”的技术。
在您的类表继承案例中,我们首先设计一个名为“机构”的表,其中包含一个 Id 字段、一个名称字段以及与机构相关的所有字段,无论它们是四种中的哪一种。例如,邮寄地址字段之类的东西。同样,您比我更了解您的数据,并且您可以找到所有四个现有表中的字段。我们以通常的方式填充 id 字段。
接下来我们设计了四个表,分别称为“Hospitals”、“Clinics”、“Schools”和“Universities”。这些将包含一个 id 字段,以及仅与该类型机构相关的所有数据字段。例如,医院可能有“床位容量”。同样,您比我更了解您的数据,并且您可以从现有表中未包含在机构表中的字段中找出这些数据。
这就是“共享主键”的用武之地。当在“机构”中创建一个新条目时,我们必须在四个专门的子类表之一中创建一个新的并行条目。但是我们不使用某种自动编号功能来填充 id 字段。相反,我们将“机构”表中的 id 字段的副本放入子类表的 id 字段中。
这是一个小工作,但好处是值得付出努力。共享主键强制子类条目和超类条目之间关系的一对一性质。它使连接超类数据和子类数据变得简单、容易和快速。它不需要一个特殊的字段来告诉你给定机构属于哪个子类。
而且,就您而言,它为您的原始问题提供了方便的答案。您最初询问的外键现在始终是机构表的外键。而且,由于 shared-primary-key 的魔力,外键还引用了相应子类表中的条目,而无需额外的工作。
为方便起见,您可以创建四个视图,将机构数据与四个子类表中的每一个相结合。
在网上查找“ER Specialization”、“Class Table Inheritance”、“Shared Primary Key”,也许还有“Single Table Inheritance”,也可以在 SO 中查找。SO中的大多数概念或技术都有标签。