数据库外键在一列或另一列中

时间:2017-01-17 12:23:41

标签: database join database-design

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

示例:

表'服务器' (以及其他)两个领域 - > '内部ip'和'外部IP'

另一张表' server_details'只有一个字段' ip'。

' server_details'和'服务器'应该在ip加入。

问题是,我们不知道server_details中的ip是外部还是内部ip,因此它可能出现在一个或另一个列中,但每个ip(应该)都是唯一的整个数据库,将在两个可能的字段之一中匹配一个数据集。

有人能告诉我如何实现这个目标吗?或者根本不可能?

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

4 个答案:

答案 0 :(得分:0)

我认为你正朝着相反的方向前进。

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

答案 1 :(得分:0)

链接表的想法是网络数据模型的遗留物。在关系数据库中,我们可以定义外键约束(完整性约束,确保一个列的值存在于另一个列中,但不创建或限制访问路径)和连接表(在任何条件下,无论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约束可能不合适。有可能重构您的设计,使其更易于完整性约束。如果您发布架构或列出功能依赖项,我可以修改我的答案。

答案 2 :(得分:0)

除非服务器已经有PK,否则您应该考虑向服务器添加一个可以声明为PK的id字段。然后,在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影响的。

答案 3 :(得分:0)

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