【问题标题】:Database foreign key in either one or another column一列或另一列中的数据库外键
【发布时间】:2023-03-23 11:38:01
【问题描述】:

即使不清楚外键出现在哪一列,是否可以将一个表链接到另一个表?

例子:

表 'server' 有(除其他外)两个字段 -> 'internal ip' 和 'external ip'

另一个表“server_details”只有一个字段“ip”。

'server_details' 和 'server' 应该在 ip 处加入。

问题是,我们不知道 server_details 中的 ip 是外部 ip 还是内部 ip,所以它可能出现在其中一列或另一列中,但每个 ip(应该)对于整个数据库都是唯一的并且肯定会匹配两个可能字段之一中的一个数据集。

谁能告诉我如何实现这一点?还是根本不可能?

我最后必须将此行为映射到教义实体...

【问题讨论】:

标签: database join database-design


【解决方案1】:

我认为你的做法正好相反。

server.internal_ipserver.external_ip 可以与 server_details.ip 有外键关系

【讨论】:

  • 这是一个很好的建议......我会尝试同时提供外键并将 server_details.ip 约束设置为“not null”。也许这会奏效。
  • 好的,我发现,这可能不适用于我的情况......我无法在不创建目标字段的情况下将外键添加到 server_details.ip (server.internal_ip/server.external_ip)唯一的,因为内部 ip 可能出现不止一次。规则如下:如果存在外部ip,则将其作为外键。如果没有,请使用内部 ip ...对于只有内部 ip 的所有条目,此密钥必须是唯一的...复杂:/
  • server_details.ip 是唯一的吗?如果是这样, server.internal_ip/server.external_ip 不必是唯一的。基本上 server_details.ip 可能是该表的主键?
  • server_details.ip 不是唯一的,因为一台服务器可能有一个或多个服务器详细信息
  • 也许我应该为内部/外部机器/ips 使用 2 个表
【解决方案2】:

链接表的想法是网络数据模型的遗物。在关系数据库中,我们可以定义外键约束(完整性约束,确保一列的值存在于另一列中,但不创建或限制访问路径)和连接表(在任何条件下,无论 FK 约束如何)。但是,您使用 Doctrine 可能会在这方面限制您,因为对象关系映射器试图重新发明网络模型数据库。

您可以轻松加入serverserver_details

SELECT *
FROM server_details sd
INNER JOIN server s ON sd.ip = s.internal_ip OR sd.ip = s.external_ip

或者可能

INNER JOIN server s ON sd.ip = COALESCE(s.external_ip, s.internal_ip)

FK 约束是另一回事。如果您的所有列都没有唯一代表 IP 的域,则 FK 约束可能不合适。可以重构您的设计,使其更适合完整性约束。如果您发布架构或列出功能依赖项,我可以修改我的答案。

【讨论】:

    【解决方案3】:

    您应该考虑向服务器添加一个可以声明为 PK 的 id 字段,除非服务器已经有一个 PK。然后,在 server_details 中放置一个名为 server_id 的字段,并将其声明为引用 server.id 的 FK。现在,加入很简单:

    SELECT *
    FROM server_details sd
    INNER JOIN server s ON sd.server_id = s.id
    

    id 字段仅用于唯一标识服务器。您可以使用 DBMS 的自动编号功能来分配新值。

    我不确定 Doctrine 如何影响它。

    【讨论】:

      【解决方案4】:

      问题消失了,因为至少我们重新定义了我们的数据模型。无论如何感谢您的帮助!

      【讨论】:

        猜你喜欢
        • 2016-10-17
        • 1970-01-01
        • 2020-04-12
        • 1970-01-01
        • 2018-07-19
        • 1970-01-01
        • 2018-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多