使用具有单个列的子表继承

时间:2015-01-27 17:29:42

标签: inheritance database-design

对于我的数据,使用Table-Per-Type模式将导致'子类'只有一列的表(父表的主键)。

通过在子表中没有自动增量主键,我可以在为连接执行连接时跳过该表,但是对于具有foriegn关系的其他表中的插入仍然具有强类型。

我的情况有点复杂,但归结为以下示例:

  • 有一个'客户'和' Salesrep'子类。

  • 人员表有自动增量ID和姓名/地址/电话。子类没有专门的信息(只是Person表的外键),只需指明类型。

  • CustomerOrder表可以有一个对Customer表的外键引用,一个对Salesrep表的引用

这样,当我插入客户订单时,它强制执行我不会为这两个字段获取错误类型的Person。 但是,当我做一个级联'在CustomerOrder上阅读,我只加入Person而不需要额外加入“客户”#39;和' Salesrep'表。

这种方法有什么问题吗?这是一个已知/命名的模式吗?

看起来很奇怪,只有一列的表格,我不会看到很多人这样做,但我看不出有什么问题。我可以将其作为person表中的类型字段,但是让外键在CustomerOrder等其他表中工作很麻烦(需要复合键?)。

(我想我必须在代码中确保同一个人不会出现在Customer和SalesRep表中,但这比在所有引用Person的表中强制执行的东西更容易)

1 个答案:

答案 0 :(得分:1)

据我所知,你的方法没有错。您正在遵循连接表继承模式,其中子表(表示子类)通过其主键(也是引用超级表的外键)连接到它们的超级表。

当然,在子表中没有很多(或任何)附加列的情况下,通常会使用单表继承方法只使用一个表personstype(或category)列。但是,正如您所指出的,这将意味着对customer类的salesRepCustomerOrder属性的约束,这些属性无法实现为customer_orders表的简单外键。相反,似乎需要触发器来强制执行这些约束。

因此,在更复杂的Joined Tables继承表示与customersalesRep的参照完整性约束的简单实现之间进行权衡,而不是更简单的表示(具有单表继承) )使用更复杂的参照完整性约束实现。