2010-06-16 8 views
12

소셜 네트워크에서 볼 수있는 것과 같은 뉴스 피드를 구현해야한다면 ex facebook을 사용할 수 있습니다. 현재 Image, Comment, Friendship, GroupMembership 등과 같은 종류의 다형성 배열이있는 News 클래스를 사용하고 있습니다. 객체가 생성 될 때마다 News도 생성됩니다. 그것은 AR (ActiveRecords)와 잘 작동하지만 DM (DataMapper) 또는 Sequel로 전환하면 문제가 발생합니다. 둘 다 다형성 연결을 지원하지 않으며 사용법을 방해합니다.다형성 연관을 피하는 방법

한 가지 해결 방법은 많은 수의 UNION이있는 큰 SQL 절을 사용하여 뉴스로 간주되어야하는 모든 다른 테이블을 병합하는 것입니다. 그러나 여기에는 몇 가지 단점이 있으며, 특히 성능은 끔찍할 것입니다.

그래도 다형성 연결을 사용하지 않고도 성능을 향상 시키면서도 메타 데이터를 뉴스에 추가 할 수있는 등의 단점이없는 방법을 궁금해합니다.

답변

21

면책 조항 : 저는 Sequel의 수석 개발자입니다.

대개 가장 좋은 방법은 데이터로 수행 할 작업의 유형에 따라 다릅니다. 그것에 대해 이동하는 방법 중 하나는 모든 가능한 관계를 외래 키 열이하는 것입니다

news: 
    id 
    ... (Other columns) 
    image_id 
    comment_id 
    friendship_id 
    group_membership_id 

정말 것들을 일반적인 외래 키를 갖는 클래스 이름을 저장 대 이런 식으로 일을에는 성능 차이가 없습니다. 게으른로드의 경우, nil/NULL이 아닌 하나의 외래 키 필드를 선택하고로드 할 적절한 연결을 선택하십시오. 테이블 당 열망로드의 경우 모든 연결을 한 번에로드하면됩니다. 이것은 JOIN을 사용하여 열심히로드 할 수 있다는 점에서보다 융통성이 있으며, 다형성 접근 방식으로는 불가능합니다. 또한 실제 참조 무결성의 이점을 누릴 수 있습니다.

미래에 더 많은 연관 유형을 추가하려면 외래 키를 테이블에 추가해야한다는 단점이 있습니다.

+0

감사합니다 ... 진짜 간단하지만 좋은 생각입니다 .--). 그것은 모델에 대한 약간의 변경을 필요로하지만 (ref의 실제 연관을 되 돌린다.) – gucki

+0

나는 이것이 해결책이라고 생각하지 않는다. 예를 들어, '리뷰'는 잠재적으로 '비즈니스'또는 '사람'또는 '항목'일 수 있습니다. 'review' 테이블에'business_id','person_id','item_id'를 가지고 있더라도 리뷰가 무엇을 가리키고 있는지를 알기 위해서는 모두 첫 번째 non-nil 필드를 찾아야합니다. 특정 제휴가 여러 가지 다른 경우가있을 수 있습니다. – fatuhoku

2

여기 레일의 데이터베이스 수준에서 다형성 협회의 참조 무결성을 유지하기 위해 보석의 :

https://github.com/mkraft/fides

이 게시으로 sqlite3를과 PostgreSQL을위한 어댑터가 있습니다.

면책 조항 : 나는 보석을 썼다.

관련 문제