【问题标题】:Designing Postgresql table with multiple foreign key candidates设计具有多个外键候选的 Postgresql 表
【发布时间】:2021-08-03 05:01:57
【问题描述】:

当设计一个包含 2 个或更多可能的参考/外键候选的表时,应该如何实现?

假设我们有以下内容:

Table Trigger {
...
- condition1  [FK: BookSales or BookPrice]
- operation1  [enum: and, or, not..]
- condition2  [FK: BookSales or BookPrice]
- operation2  [enum: and, or, not..]
- condition3  [FK: BookSales or BookPrice]
}

现在BookSalesBookPrice这两个表没有完全相同的字段,应该可以重复用于不同的触发器。

一个想法是创建一个表格,例如:

Table BookPriceOrSale {
...
- cType [enum: Price, Sales]
<fields for BookPrice>
<fields for BookSales>
}

然后根据cType 简单地评估它,并将其作为 FK:condition1 [FK: BookPriceOrSale]

另一种选择当然是创建一个中间表,其中一个为外键,另一个为空 - 然而,与上面的表相比,这增加了另一个表,消除了一个,但添加了额外的列.

Table TriggerCondition {
...
priceCondition [FK: BookPrice] 
SalesCondition [FK: SalesPrice] 
}

这里我们改为将其引用为condition1 [FK: TriggerCondition]

第三种选择我可以想象是使用继承,但我不太确定这一点..

我的直接想法是建议使用选项 2 来确保正确性,但我想知道是否有知识渊博的人可以就如何解决这个问题提供一些指导。

【问题讨论】:

    标签: sql django postgresql database-design foreign-keys


    【解决方案1】:

    尝试使用带有Generic relations 功能的方法 https://docs.djangoproject.com/en/3.2/ref/contrib/contenttypes/#generic-relations

    【讨论】:

    • 您能否在答案中添加或描述实现的底层结构 - 它在 Postgre 中的工作方式以及可能如何查询它(非 ORM)?
    • 在 DB 端,它看起来像两个整数字段和一个索引。第一个字段存储对象类型。第二个对象 ID。所有其他魔法都由 Django 在其元类中完成。链接上的文档非常详细。尝试使用
    • 谢谢谢尔盖。也许我应该自己实现这个并查看 DB 模式,但我认为答案将从示例查询中受益匪浅,也许使用上面详述的场景。
    猜你喜欢
    • 1970-01-01
    • 2014-12-29
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2018-11-22
    相关资源
    最近更新 更多