代码之家  ›  专栏  ›  技术社区  ›  Tom

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

  •  2
  • Tom  · 技术社区  · 14 年前

    user_id (PK) | username| email | something
    

    ... 一个用户查看另一个用户时的“视图”表:

    view_id (PK) | viewer_id | viewed_id | view_date
    

    “查看者id”和“查看者id”都是用户id,允许我分别搜索用户是查看者或正在查看的用户时的实例。

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

    这让我现在很困惑,这是MySQL的正确行为,是教义上的问题,还是我处理这件事的方式上的问题,还是没什么好担心的!一个表中是否有两个单独的外键映射到另一个表中的同一列?考虑到连接仍然可以通过用户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 回复  |  直到 14 年前
        1
  •  5
  •   Felix Kling    14 年前

    现在我们开始:

    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 .

        2
  •  1
  •   soulmerge    14 年前

    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)