1

私は長年のPHP開発者であるため、現在Ruby On Railsを学習しようとしています。そのため、ページのような独自のコミュニティを構築しています。

私はかなり遠くまで来て、MySQLを使用してユーザーモデルなどを作成しました。

しかし、それから私はMongoDBのことを聞いて、もう少し調べてみると、それはちょっといいと思います。

だから私はそれを設定し、レールとMongoDB間の接続にmongomapperを使用しています。

現在、サイトのニュースページに使用しています。

また、すべてのユーザーのプロファイルページがあり、他のユーザーが自分のプロファイルにアクセスして小さなメッセージを書くことができるように、自分のゲストブックが含まれています。

私の考えは、ユーザーモデルをMySQLの使用からMongoDBの使用を開始するように変更することです。

まず、各ユーザーのモデルがどのように設定されているかを示します。

ユーザーモデル:

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を含めることができるため、ユーザーごとに1つのテーブルを作成し、そのテーブルにすべてのゲストブックエントリの「列」を作成したいと思います。これを実行したいので、ユーザーごとに1つのテーブルしかありませんが、ゲストブックを作成するためだけに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つの問題が考えられます。ニックネームや誕生日などのユーザー情報を取得するだけの場合は、すべてのユーザーのゲストブックの投稿を取得する必要があります。そして、各ユーザーがゲストブックに1000の投稿を持っている場合、システムのために取得するのは非常に多くなります。それとも私は間違っていますか?

他の方法でやるべきだと思いますか?

4

2 に答える 2

1

何千ものゲストブックエントリがある場合は、それを別のコレクションにすることをお勧めします(あなたが述べた理由とまったく同じです)。

于 2010-05-06T20:42:59.233 に答える
1

いいえ、ユーザーをフェッチする場合、すべてのゲストブックエントリをフェッチする必要はありません。これは、のmongoクエリであり、MongoMapperの動作はそれほど変わらないはずです(私自身はMongoidを使用しています)。

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

注意すべき点として、MongoDBには1つのドキュメントに対して4 MBの制限がありますが、それは数万のゲストブックエントリである必要があります。古いものを一種のアーカイブにプッシュしたほうがよいでしょう。

于 2010-05-08T22:28:09.730 に答える