2010-01-31 101 views
2

我遇到过一些看似简单的东西,但又让我再次挠挠头。我有一个用户表:MySQL:在一个表中引用另一个表的两个外键

user_id (PK) | username| email | something 

...和“意见”,当一个用户查看其他用户的表:

view_id (PK) | viewer_id | viewed_id | view_date 

的“viewer_id”和“viewed_id”都是user_ids,允许我分别搜索用户是查看者还是正在查看的实例。

我最初认为这两列都是外键,但是在我的schema.yml文件(我使用Doctrine 1.2)中创建了表并且指定了两个单独的外键关系(每列一个),它似乎学说只考虑了这两个表之间的第一个列出的外部关系(user_id> viewer_id)。

现在是否让我感到困惑,无论这是MySQL的行为是否正确,教义中的问题,还是我接近这个问题的方式,或者没有什么可担心的!一个表中可以有两个单独的外键映射到另一个表中的同一列吗?鉴于JOIN仍然会让我通过user_id访问“视图”,这是否合乎逻辑?我弄错了吗?

谢谢你的时间。

编辑 - 架构文件:

User: 
relations: 
View: {class: View, local: user_id, foreign: viewer_id, type: many, foreignType: one, alias: View, foreignAlias: User} 
View: {class: View, local: user_id, foreign: viewed_id, type: many, foreignType: one, alias: View, foreignAlias: User} 

... only difference is viewer_id/viewed_id 
+0

你可以显示你的模式文件的这一部分?也许你没有正确设置它。 – 2010-01-31 12:51:11

+0

添加了模式文件。 – Tom 2010-01-31 12:55:05

回答

5

而这里我们去: 您指定了关系的相同别名。

User: 
    relations: 
    viewed_by: 
     class: View 
     local: user_id 
     foreign: viewed_id 
     type: many 
     foreignType: one 
     foreignAlias: viewed 

    viewed: 
     class: View 
     local: user_id 
     foreign: viewer_id 
     type: many 
     foreignType: one 
     foreignAlias: viewer 

或者你设置了整个许多一对多的关系是不同的:

User: 
    relations: 
    viewed_by: 
     class: User 
     local: viewed_id 
     foreign: viewer_id, 
     refClass: View 
    viewed: 
     class: User 
     local:viewer_id 
     foreign: viewed_id 
     refClass: View 

View应该像

View: 
    columns: 
    viewed_id: 
     type: integer 
     primary: true 
    viewer_id: 
     type: integer 
     primary: true 

参见many-to-many relationships教义文档。

+0

谢谢Felix,让我试试看。 – Tom 2010-01-31 13:17:47

+0

顶部的Alias修复程序为我解决了它。需要花更多时间阅读文档,以便正确理解它。谢谢你的帮助! – Tom 2010-01-31 13:29:47

+0

谢谢!它在我的项目中帮助了我很多。 – GiantRobot 2012-01-07 19:17:02

1

MySQL允许在同一个表的多个外键,甚至到另一个表中的同一列,但我不知道为什么学说只创建其中之一:

mysql> CREATE TABLE test1 (id INT); 
Query OK, 0 rows affected (0.00 sec) 

mysql> CREATE TABLE test3 (ref1 INT, ref2 INT, FOREIGN KEY (ref1) REFERENCES test1(id), FOREIGN KEY (ref2) REFERENCES test1(id)); 
Query OK, 0 rows affected (0.01 sec) 
+0

谢谢,我认为它缩小到我的模式语法。 – Tom 2010-01-31 13:17:30

相关问题