【问题标题】:Inheritence using sub-table with a single column使用单列子表继承
【发布时间】:2015-01-27 17:29:42
【问题描述】:

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

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

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

  • 具有“客户”和“销售代表”子类的人员类。

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

  • 一个 CustomerOrder 表可以有一个指向 Customer 表的外键引用和一个指向 Salesrep 表的外键

这样,当我插入客户订单时,它会强制我不会为这两个字段获得错误的 Person 类型。 但是,当我对 CustomerOrder 进行“级联”读取时,我只加入到 Person 而不需要额外加入到“客户”和“销售代表”表。

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

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

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

【问题讨论】:

    标签: inheritance database-design


    【解决方案1】:

    据我所知,您的方法没有任何问题。您正在遵循 Joined Tables Inheritance 模式,其中子表(表示子类)通过它们的主键同时也是引用超表的外键连接到它们的超表。

    当然,在子表没有很多(或任何)附加列的情况下,通常会使用单表继承方法,只有一个表persons和@987654322 @(或category)列。但是,正如您所注意到的,这意味着对CustomerOrder 类的属性customersalesRep 的约束,它们不能作为customer_orders 表的简单外键来实现。相反,似乎需要触发器来强制执行这些约束。

    因此,在更复杂的联接表继承表示与更简单的引用完整性约束实现 customersalesRep 与更简单的表示(使用单表继承)与更简单的表示之间进行权衡参照完整性约束的复杂实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 2010-09-17
      相关资源
      最近更新 更多