【问题标题】:What is the best way to handle foreign keys with using type/subtype data model? [closed]使用类型/子类型数据模型处理外键的最佳方法是什么? [关闭]
【发布时间】:2020-12-22 11:06:03
【问题描述】:

我必须为一组(有限的)产品创建一个数据库结构,这些产品具有一些共同的和许多不同的属性。我创建了一个主要的Product 表/类型,并为每个子类型(CarBike)创建了一个单独的表。在每个子类型中都有一个具有唯一约束(一对一关系)的 product 的外键引用,它也用作子类型中的主键。

我必须以目标表可以包含任何一种产品类型的方式引用其他表中的产品。例如,有一个以产品为外键的合同表。它可以是任何子类型(CarBike 等)。我应该如何为这些外键建模?

我有两个解决方案。我可以在没有 FK 约束的合同表中创建引用,还可以添加另一个字段以保存到产品的子类型(多态关联)。但是我必须在很多地方引用该产品。恐怕这种方法在广泛使用时会造成无法维护的混乱。

第二种解决方案是我只在每个关系中引用产品超类型,并从超类型访问子类型属性,因为每个超类型记录都会有一个且只有一个子类型记录。

我想知道从长远来看,第二种方法的可管理性如何?当我在查询产品表时还需要获取子类型的属性时,连接表的最佳方法是什么?

【问题讨论】:

    标签: postgresql database-design foreign-keys


    【解决方案1】:

    我会使用第二种方法,并为product 表创建一个外键,您需要在一般情况下引用“产品”(不是特定的产品类型)。

    如果您在查询时确实需要额外的子类型特定属性,例如contract 表,您始终可以连接到子类型表或在单独的查询中检索附加属性。这取决于您在只需要“产品”的上下文中需要特定属性的频率。

    根据您对产品特定属性的要求,您可能需要考虑完全放弃子类型表,并将类型特定属性存储在product 表的jsonb 列中。如果您对数据类型检查或一组固定(和受控)的附加属性有非常严格的要求,那么这显然行不通。

    【讨论】:

      【解决方案2】:

      这样的问题不时被问到,尽管通常子类型是针对手头的情况而定的。

      你可以查看我平时的回答here 注意到我使用的术语是超类/子类。

      您的方法类似于类表继承。

      一个值得一看的技术是共享主键。子类没有自己的 Id 字段。相反,他们使用超类表的 Id 字段的副本。这个副本可以作为返回超类表的外键,也可以作为子类表的主键。这使得一些连接变得简单、容易和快速。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-14
        • 2010-09-05
        • 2015-12-09
        • 1970-01-01
        • 2010-12-02
        • 2011-06-22
        • 2012-07-31
        相关资源
        最近更新 更多