冒着成为“建筑宇航员”的风险,我更倾向于为子类使用单独的表格。让子类表的主键也是链接回超类型的外键。
这样做的主要原因是它在逻辑上变得更加一致,并且您最终不会得到很多针对该特定记录的 NULL 和无意义的字段。这种方法还使得在迭代设计过程时向子类型添加额外字段变得更加容易。
这确实增加了在查询中添加 JOIN 的缺点,这会影响性能,但我几乎总是先采用理想的设计,然后在证明有必要时再进行优化。有几次我先走“最佳”方式,但后来我几乎总是后悔。
所以我的设计会是这样的
PERSON (personid, name, address, phone, ...)
SPECIALPERSON (personid REFERENCES PERSON(personid), 额外字段...)
USER (personid REFERENCES PERSON(personid), username, encryptedpassword, extra fields...)
如果有必要,您还可以稍后创建聚合超类型和子类型的视图。
这种方法的一个缺陷是,如果您发现自己在大量搜索与特定超类型相关的子类型。在我的脑海中没有简单的答案,您可以在必要时以编程方式跟踪它,或者运行 soem 全局查询并缓存结果。这将取决于应用程序。