是否可以将一个表链接到另一个表,即使它不清楚外键出现在哪一列?
示例:
表'服务器' (以及其他)两个领域 - > '内部ip'和'外部IP'
另一张表' server_details'只有一个字段' ip'。
' server_details'和'服务器'应该在ip加入。
问题是,我们不知道server_details中的ip是外部还是内部ip,因此它可能出现在一个或另一个列中,但每个ip(应该)都是唯一的整个数据库,将在两个可能的字段之一中匹配一个数据集。
有人能告诉我如何实现这个目标吗?或者根本不可能?
我必须最后将这种行为映射到教义实体......
答案 0 :(得分:0)
我认为你正朝着相反的方向前进。
server.internal_ip
和server.external_ip
可以与server_details.ip
具有外键关系
答案 1 :(得分:0)
链接表的想法是网络数据模型的遗留物。在关系数据库中,我们可以定义外键约束(完整性约束,确保一个列的值存在于另一个列中,但不创建或限制访问路径)和连接表(在任何条件下,无论FK如何)约束)。但是,由于对象关系映射器试图重新构建网络模型数据库,因此使用Doctrine可能会限制您的使用。
您可以轻松加入server
到server_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)
问题已经消失,因为至少我们重新定义了数据模型。无论如何,谢谢你的帮助!