2010-05-06 4 views
1

저는 오랫동안 PHP 개발자 였으므로 현재 Ruby On Rails를 배우려고하고 있습니다. 그래서 나는 페이지와 같은 자신 만의 커뮤니티를 만들고 있습니다.MongoDB와 Ruby On Rails 및 Mongomapper 플러그인 사용

저는 꽤 멀리 왔고 MySQL을 사용하여 사용자 모델 등을 만들었습니다.

그러나 나는 MongoDB에 대해 들어서 조금 더 살펴 봤는데 나는 친절하다고 느낍니다.

그래서 설정하고 레일과 MongoDB 간의 연결을 위해 mongomapper를 사용하고 있습니다.

이제 사이트의 뉴스 페이지에 사용 중입니다.

나는 또한 자신의 방명록이 포함 된 모든 사용자의 프로필 페이지를 가지고있어서 다른 사용자가 자신의 프로필로 와서 그들에게 약간의 메시지를 쓸 수 있습니다.

이제 사용자 모델을 MongoDB 사용을 시작하기 위해 MySQL을 사용하는 것으로 변경하는 것이 좋습니다.

각 사용자의 모델 설정 방법을 보여줌으로써 시작할 수 있습니다.

사용자 모델 :

class User < ActiveRecord::Base 
      has_one :guestbook, :class_name => "User::Guestbook" 

방명록 모델 모델 :

class User::Guestbook < ActiveRecord::Base 
    belongs_to :user 
    has_many :posts, :class_name => "User::Guestbook::Posts", :foreign_key => "user_id" 

그리고 방명록 게시물 모델 : 난 내 자신에 대한 이런 식으로 분할 한

class User::Guestbook::Posts < ActiveRecord::Base 
    belongs_to :guestbook, :class_name => "User::Guestbook" 

편리하지만 지금은 MongoDB로 마이그레이션하려고 할 때 테이블을 만드는 방법을 모른다.

MongoDB가 EmbeddedDocument를 가질 수 있기 때문에 각 사용자에 대해 하나의 테이블을 갖고 그 테이블에 모든 방명록 항목에 대한 "열"을 갖고 싶습니다. 나는 방금 방명록을 가질 수 있도록 3 개의 테이블을 가지고있을 때마다 각 사용자마다 하나의 테이블을 가지고 있고 지금은 좋아하지 않기 때문에 이렇게하고 싶습니다.

사용자 모델 :

class User 
    include MongoMapper::Document 
    one :guestbook, :class_name => "User::Guestbook" 

방명록 모델 모델 :

class User::Guestbook 
    include MongoMapper::EmbeddedDocument 
    belongs_to :user 
    many :posts, :class_name => "User::Guestbook::Posts", :foreign_key => "user_id" 

그리고 방명록 게시물 모델 :

그래서 내 생각은 다음과 같이 그것을 가지고하는 것입니다

class User::Guestbook::Posts 
    include MongoMapper::EmbeddedDocument 
    belongs_to :guestbook, :class_name => "User::Guestbook" 

그러나 그때 나는 하나의 문제를 생각할 수 있습니다. 그저 닉네임과 생년월일과 같은 사용자 정보를 가져오고 싶을 때 모든 사용자 방명록 게시물을 가져와야합니다. 그리고 각 사용자가 방명록에 수천 개의 게시물을 가지고 있다면 시스템을 가져올 수 있습니다. 아니면 내가 틀렸어?

내가 다른 방식으로해야한다고 생각합니까?

답변

1

당신이 사용자를 가져올 경우 모든 방명록 글을 가져올 필요가 없습니다 아니,이에 대한 몽고 쿼리없고 MongoMapper는 (나 자신을 위해, 내가 Mongoid을 사용하고 있습니다) 너무 다르게 작동 안 :

db.users.find({_id: '21314'}, {guestbook: 0}) 
       // instead of {guestbook: 1} which would return only the guestbook 

MongoDB는 하나의 문서에 대해 여전히 4MB의 제한이 있지만 수만 장의 방명록 항목이어야합니다. 오래된 파일을 일종의 아카이브로 푸시 할 수도 있습니다.

+0

나 자신을 찾을 수 없으므로 mongomapper 쿼리를 써 주시겠습니까? 감사! – Lisinge

+1

그래, 설명서, 몽고 마커의 어두운면. 가장 좋은 조언은 mongomapper의 테스트 사례를 자세히 읽는 것입니다. 관심있는 주제는 다음과 같습니다. http://github.com/jnunemaker/mongomapper/blob/master/test/unit/test_query.rb#L292-294 'User.find ('12341', : select => {: 방명록 => 0})' –

+0

그래, mongomapper는 위대하다고 생각하지만 문서가 없으면 실제로 그걸 가져온다. 나는 당신이 그것을 언급했을 때 몽고 이드를 조금 보았다. 그리고 그것은 정말로 멋져 보인다. mongomapper로 바꾸라고 권하겠습니까? – Lisinge

1

수천 개의 방명록 항목이있는 경우 별도의 모음으로 지정하는 것이 좋습니다 (명시한 이유와 동일).

+0

그래서 EmbededDocument에서 사용해야합니까? 게시물을위한 별도의 테이블을 만들어야합니까? – Lisinge

+0

그냥 사용할 수 없습니까? select? 또는 심지어 모든 게스트 블로그 게시물을 가져 옵니까? 게시물 모델을 사용할 때만 게시물을 가져올 수 있습니까? – Lisinge

+0

나는 임베디드 문서를 개념적으로 데이터베이스의 비정규 화와 유사하게 보았다. 그것은 두 개의 분리 된 테이블이나 컬렉션 사이의 "결합"을 피하는 방법이다. –