Postgresql 使用类型/子类型数据模型处理外键的最佳方法是什么?

Postgresql 使用类型/子类型数据模型处理外键的最佳方法是什么?,postgresql,database-design,foreign-keys,Postgresql,Database Design,Foreign Keys,我必须为一组(有限的)产品创建一个数据库结构,这些产品具有一些共同的和许多不同的属性。我已经创建了一个主产品表/类型,并且为每个子类型(汽车,自行车)创建了一个单独的表。每个子类型中都有一个具有唯一约束(一对一关系)的产品的外键引用,该外键还用作子类型中的主键 我必须以目标表可以包含任何一种产品类型的方式引用其他表中的产品。例如,有一个合同表,其中产品作为外键。它可以是任何子类型(汽车,自行车等)。我应该如何为这些外键建模 我有两个解决办法。我可以在没有FK约束的合同表中创建引用,还可以添加另一

我必须为一组(有限的)产品创建一个数据库结构,这些产品具有一些共同的和许多不同的属性。我已经创建了一个主
产品
表/类型,并且为每个子类型(
汽车
自行车
)创建了一个单独的表。每个子类型中都有一个具有唯一约束(一对一关系)的
产品的外键引用,该外键还用作子类型中的主键

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

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

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


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

我将使用第二种方法,在需要引用“产品”(而不是特定的产品类型)的任何地方为
产品
表创建外键

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


根据您对产品特定属性的要求,您可能需要考虑将子类型表全部删除,并将类型特定属性存储在<代码> JSONB</代码>列中,在产品< /C> >表中。如果您对数据类型检查或一组固定的(和受控的)附加属性有很强的要求,那么这显然是行不通的。

像这样的问题会不时被问到,尽管通常情况下,子类型是特定于当前情况的

你可以看看我通常的回答 注意我使用的术语是超类/子类

您的方法类似于类表继承

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