数据库设计:同一列用于 2 个不同的外键

Posted

技术标签:

【中文标题】数据库设计:同一列用于 2 个不同的外键【英文标题】:DB Design: Same Column used for 2 different foreign keys 【发布时间】:2011-11-15 14:37:55 【问题描述】:

我正在开发一种连接 2 个数据源(例如查询)的方法。

我有一个名为 QueryField 的表,其结构如下:

QueryID
FieldID
FieldName

....

如果我在 QueryField 上有 2 条记录

     QueryID         FieldID            FieldNAme
     ------------    ---------          ----------
     1               1                  CustomerID
     1               2                  CustAddress
     2               3                  CustNo
     2               4                  CustomerPhone

我想要一个新表 QueryFieldJoin,它定义了 2 个查询中的哪些字段用于加入。我的想法是有以下结构

 LeftJoinFieldID (FK from FieldID of QueryField)
 RightJoinFieldID (also FK from FieldID of QueryField)
 JoinType (intersect, outer join).

PrimaryKey 是 LeftJoinFieldID 和 RightJoinFieldID 的组合

    LeftJoinFieldID           RightJoinFieldId             JoinType
    --------------            ----------------             --------
    1                         3                            Intersect

这会起作用,但是我觉得这不是最好的数据库设计,它具有与另一个表上两个不同列的外部字段相同的字段。有人可以提出更好的方法吗?

【问题讨论】:

更好的方法:有两个 单独的 列,每个列都是 FK 关系之一的 FK。这样,您还可以强制数据库中的 FK 关系 以上评论+1 我不确定我明白了,我在 QueryFieldJoin 表中已经有 2 个单独的列? 这个设计对我来说很好。在 ORDERS 表中看到它,其中 SHIP_TO 和 BILL_TO 字段都引用回 ADDRESS 表。 【参考方案1】:

数据库设计还取决于您的需求:

1) 您需要回答哪些问题? 2) 您需要以多快的速度访问这些数据?

从富有表现力的 POV 来看,您的设计可能是正确的,但可能不是最佳解决方案,具体取决于您需要运行哪些查询。

例如,您可以考虑使用三个不同的表:一个用于字段,一个用于查询,一个用于操作。

如果您不想执行任何联接,甚至可以在一张大桌子上放所有东西。

【讨论】:

以上是关于数据库设计:同一列用于 2 个不同的外键的主要内容,如果未能解决你的问题,请参考以下文章

引用另一个模式的外键

一列用于 Entity Framework Core 中两个不同表的外键

如何确定哪些列用作外键?

我尝试从同一数据库的 4 个不同表中获取信息

将我的外键放在哪里以获得最佳数据库设计?

数据库设计可以不要外键的7个理由