MongoDB/NoSQL スキーマを学ぶ機会として、MongoDB プロジェクトを開始しています。これはライブ チャット アプリで、スタックには Rails 3、Ruby 1.9.2、Devise、Mongoid/MongoDB、CarrierWave、Redis、JQuery が含まれます。
ライブ チャットのポーリングとメッセージのキューイングを別々に処理します。Node.js、APE、またはカスタム EventMachine アプリのいずれかです。しかし、Mongo に関しては、アプリ内の他のすべて、特にチャット ログと履歴トランスクリプトに使用することを考えています。
私の質問は、私の以前の経験はすべて MySQL とリレーショナル DB スキーマであったため、どのようにスキーマを設計するのが最善かということです。サブ質問として、埋め込みドキュメントと関連ドキュメントのどちらが最適かという質問があります。
アプリには次のものがあります。
- 複数の部屋を持つ複数のアカウント
- 複数の部屋
- 部屋ごとに複数のユーザー
- ユーザーが入ることを許可されているルームのリスト
- ルームごとに複数のユーザー チャット
- 部屋ごと、ユーザーごとに検索可能なチャットログ
- 特定のチャットのオプションの添付ファイル
Mongo (少なくとも最後に確認したとき) には 4MB のドキュメント制限があるため、ルームのコレクションを作成し、すべてのルーム チャットを埋め込みドキュメントとして保存することはうまくいかないと思います。
これまで考えてきたことから、次のようなことを考えています。
- アカウントのコレクション
- 部屋のコレクション
- 各部屋はアカウントに関連付けられています
- ルーム内のすべてのチャット メッセージのチャット コレクション内の関連ドキュメント
- 現在ルームにいるすべてのユーザーを一覧表示する埋め込みドキュメント
- ユーザーのためのコレクション
- ユーザーが現在いるすべてのルームを一覧表示する埋め込みドキュメント
- ユーザーが入ることを許可されているすべての部屋を一覧表示する埋め込みドキュメント
- チャットのコレクション
- 各チャットはルーム コレクション内のルームに関連付けられます
- 各チャットはユーザー コレクション内のユーザーに関連付けられます
- オプションのアップロードされた添付ファイルに関する情報を含む埋め込みドキュメント。
私の主な関心事は、これが最終的にリレーショナル スキーマのように見えて目的を破るまで、どこまで行くかということです。埋め込みよりも関連性が高いことは間違いありません。
もう 1 つの懸念事項は、関連ドキュメントの参照は、私が聞いた埋め込みドキュメントへのアクセスよりもはるかに遅いということです。
次のような一般的なクエリを作成したい:
- アカウントのすべての部屋をくれ
- ルーム内のすべてのチャットを教えてください (または日付範囲でフィルター処理)
- 特定のユーザーからのすべてのチャットを受け取る
- 特定の会議室または特定の組織にアップロードされたすべてのファイルを提供する
- 等
スケールする方法でスキーマを効率的に構造化する方法について何か提案はありますか? みんな、ありがとう。