2010-01-31 5 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 사용)에 테이블을 만들고 두 개의 별도 외부 관계 (각 열에 하나씩)를 지정 했으므로 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 
+0

스키마 파일의이 부분을 표시 할 수 있습니까? 어쩌면 제대로 설정하지 않은 것일 수 있습니다. –

+0

스키마 파일이 추가되었습니다. – Tom

답변

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 

Viewmany-to-many relationships에 교리 문서를 참조하십시오

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

처럼 보일 것입니다.

+0

펠릭스, 고맙습니다. – Tom

+0

상단에있는 별칭 수정으로 해결됩니다. 문서를 가지고 좀 더 많은 시간을 할애하여 머리를 올바르게 감길 필요가 있습니다. 당신의 도움을 주셔서 감사합니다! – Tom

+0

감사합니다. 그것은 내 프로젝트에서 많은 도움이되었습니다. – GiantRobot

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

관련 문제