细化解析在数据库中用子类型设计关系表
理论上,在设计过程中揭示的每一个实体都会产生一个表。如果应用程序处理员工,就会建立一个员工表;如果那些员工中有经理,就会有一个经理表。
但实际上,如果两个实体十分相似,用单独一个表来处理它们会更有效率。员工与经理成为一个扩充员工表的“子类型”。
你必须决定如何处理子类型之间的差异。如果不同的子类型需要相同的数据,只是解释不同的话,你可以对所有子类型使用同一些列。另一个方法就是建立专门针对子类型的列。每种方法各有其优缺点。
对列进行再利用时,需要在表中增加另一列来指明特定行中的子类型。这对于解释超载列中的数据十分重要。
使用单独的列时,就不需要增加这样的指示列。对任何列进行针对某一子类型的 IS NULL 测试就可决定行是否属于那个子类型。结果为数值表明它属于那个子类型,结果为零值则说明它属于其它的子类型。
你还可以在一个表中模拟两个以上的子类型,但上面提到的原则同样适用于这些情形。根据数据的不同,你也可以结合使用这两种方法。
假设我们希望在同一个表中处理员工和经理。除两个实体间的公共列以外,员工有小时工资,而经理有年薪。另外,经理有一个指定的停车位号码( 1 到 50 之间),而员工只有普通的停车通行号(多达 9999 )。 列表 A 中是一个新建表( CREATE TABEL )语句,其中两个子类型使用相同的两列; 列表 B 是使用单独列的新建表( CREATE TABEL )语句。
注意,在列表 A 中,可以使用非零限制来防止数据丢失,但在列表 B 中则不行。还要注意,列表 A 中的 CHECK 限制必须应用于表级别,因为它们参考一个以上的列。列表 B 的 CHECK 限制可应用于列级别,因为它们只处理当前列的内容。它们也更加简单,但数量更多。