MySQL:一个表中的两个外键引用另一个表

时间:2010-01-31 12:45:39

标签: php mysql schema foreign-keys doctrine

我之前遇到过一些看起来很简单的事情,但让我再次摸不着头脑。我有一个供用户使用的表格:

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)并指定了两个独立的外部关系(每列一个),似乎Doctrine仅考虑这两个表之间列出的第一个外来关系(user_id> viewer_id)。

现在让我感到困惑的是,这是正确的MySQL行为,Doctrine中的问题,还是我接近这个问题的方式存在问题,或者没什么可担心的!一个表中是否有两个单独的外键映射到另一个表中的同一列?它是否合乎逻辑,因为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

2 个答案:

答案 0 :(得分: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上的Doctrine文档。

答案 1 :(得分:1)

Mysql允许同一个表上的多个外键,甚至是另一个表中的同一列,但我不知道为什么doctrine只创建其中一个:

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)