2011-12-21 4 views
0

Mongoid에서 참조 된 문서의 필드를 캐시하는 더 좋은 방법은 무엇입니까?Mongoid에서 참조 된 문서의 필드를 캐시하는 더 좋은 방법은 무엇입니까?

은 현재 내가 그것에 대해 추가 필드를 사용

class Trip 
    include Mongoid::Document 

    belongs_to :driver 

    field :driver_phone 
    field :driver_name 

end 

class Driver 
    include Mongoid::Document 

    field :name 
    field :phone 
end 

가 중첩 된 개체로 저장하는 캐시에 더 명확 될 수 있음으로 저장 될 것이다 몽고에 있도록 : 내가 생각

{ driver_cache: { name: "john", phone: 12345 } } 

1-1 관계가있는 임베디드 문서에 대해? 그게 옳은 선택입니까?

답변

3

저자 (Durran 요르단 (., 내부적으로 키를 문자열로 변환됩니다 명심하십시오)) 제안 folowing 옵션

이 보석은이 타입의 물건을 위해 편리하게 보인다 :

https://github.com/logandk/mongoid_denormalize

+0

멋진 찾기, 멋진 프로젝트. –

0

어느 쪽이든, 괜찮습니다.

첫 번째 접근 방식은 캐싱하는 데이터를 명시 적으로 표시하기 때문에 약간 더 좋습니다. 또한, (아마도)

+0

예, 때로는 리팩터링하여 미친 듯이 만듭니다 .-) –

0

알렉세이 :-) Mongoid에서 적은 작업, 나는 데이터가 사용되는 방법에 대해 생각 추천 할 것입니다

이 필요합니다. 여행 객체의 컨텍스트에서 항상 드라이버 정보를 사용한다면 아마도 임베디드가 적절한 선택 일 것입니다.

그러나 다른 컨텍스트에서 해당 정보를 사용하는 경우 아마도 자신이 만든 것처럼 자신의 컬렉션 일 것입니다.

또한 드라이버 개체 내에 트립을 포함시키는 것이 좋습니다. 앱이 무엇을하려하는지 감안할 때 의미가있을 수도 있고 그렇지 않을 수도 있지만 논리적으로 드라이버를 포함하는 여행 대신 각 여행 세트가 포함되어있는 것이 합리적입니다. 나는 그 상황 (운전자의 상황에서 항상 여행이있는 곳)이 위의 것보다 더 일반적이라는 것을 알 수있다.

-Tyler

+0

감사의 타일러, 여행은 주문과 같습니다. 한 명의 운전자가 하루에 약 10-12 번의 여행을합니다. –

0
당신의 캐시 데이터의

대체 해시 저장 :

field :driver_cache, type: Hash 

Mongoid의

+0

감사합니다 asaaki,하지만 나는 다른 팀원에게 아무 말도하지 않기 때문에 해시가 좋은 선택이라고 생각하지 않습니다. 모든 것이 거기 놓일 수 있습니다. –

+0

물론 전체 데이터베이스와 마찬가지로 스키마가 있습니다. 이 빠른 생각은 언급 한 비정규 화 보석 앞에있었습니다. – asaaki

1

위대한 질문입니다. 나는 옹호 관계를 비정규 화하는 보석 인 mongoid_alize을 작성 및 유지합니다. 그래서 저는이 질문에 어려움을 겪었습니다.

0.3.1에서 alize는 이제 driver_cache가있는 위의 두 번째 예제와 매우 비슷하게 해시로 1 대 1로 비정규 화 된 데이터를 저장합니다. 그러나 이전 버전에서는 별도의 필드에 데이터를 저장했습니다 (첫 번째 예).

변경 사항은 많은 요인에 의해 유발되었지만 일대일 및 일대 다 일관성을 유지하기 위해 주로 변경되었습니다 (alize는 일대일, 일대 다 및 다 대다, 다 대다). 일 - 대 - 다 (one-to-many)는 해시 배열에 데이터를 저장함으로써 항상 처리되었습니다. 따라서 해시 (Hash)처럼 일대일 저장은 훨씬 더 대칭적인 디자인이됩니다.

또한 여러 가지 다른 문제를 해결했습니다. 여기에서 자세한 설명을 볼 수 있습니다. https://github.com/dzello/mongoid_alize#release-030

희망이 있습니다.

관련 문제