web-dev-qa-db-ja.com

メッセージアプリのMongoDB構造

メッセージアプリを処理するための適切なドキュメント構造について考えています。

基本的に3種類(または4種類)のオブジェクトが必要です。

  1. ユーザー(ユーザー名、電子メール、パスワードなど)
  2. 連絡先リスト(さまざまな連絡先または連絡先グループを含む)
  3. 会話(会話は一部の人の間のメッセージのコレクションです)
  4. メッセージ(メッセージ本文、タイムスタンプ、作成者が含まれます。)

私のアイデアは、連絡先をユーザードキュメントに埋め込み、メッセージを会話ドキュメントに埋め込むことでした。

1。ユーザー

{
    username: 'dev.puS',
    usernameCanonical: 'dev.pus', // used for unique constraints
    email: '[email protected],
    emailCanonical: '[email protected],
    salt: 'some hash',
    password: 'hash with salt',
    logs: { last_login: 12.06.2008, last_password_reset: 04.03.2007 },
    state: { online: true, available: false },
    contacts: [ user_id1, user_id2, user_id3 ]
}

2。会話

{
    members: [ user_id1, user_id2 ],
    messages: [
        { author: user_2, body: 'Hi what's up' },
        { author: user_1, body: 'Nothing out here :(' },
        { author: user_2, body: 'Whanna ask some question on stackoverflow' },
        { author: user_1, body: 'Okay, lets go' }
    ]
}

このスキーマについてどう思いますか?

ドキュメントごとに更新頻度が異なるため、(ドキュメントごとに)ドキュメントを分離しておく方がよいと思います。しかし、私は本当にそれについての経験がありませんので、いくつかのアドバイスを聞くのは良いでしょう:)

よろしく

28
dev.pus

この質問は古いようですが、興味のある方は同様の質問が行われ、1つの回答が実行可能に見えます https://stackoverflow.com/a/30830429/13261

Conversation : {
 id: 123,
 members: [ user_id1, user_id2 ]
}
Message { conversationId: 123, author: user_2, body: 'Hi what's up' }
Message { conversationId: 123, author: user_1, body: 'Whanna ask some question on stackoverflow' }

アップデート#1

1)スケーラビリティ:MongoDBは非常に大規模なコレクションで適切にスケーリングします。コレクションあたり数十億のメッセージ。より大きなコレクションを複数のノードに分割できるシャーディングと呼ばれる手法があります。

2)読書。 MongoDBにはインデックス作成メカニズムがあるため、読み取りは、微調整されたデータベースエンジンに匹敵します。したがって、読書は問題になりません。特に、会話(グループ|部屋)の参加者が少ない場合(たとえば、2人が互いにメッセージをやり取りしている場合)。

14
P.M

あなたの質問は、実際にはスキーマ設計の1つです。 MongoDBスキーマ設計のこのページを見て、選択とトレードオフを理解することをお勧めします。 http://www.mongodb.org/display/DOCS/Schema+Design

さらに、おそらくそのドキュメントの「関連項目」セクションにあるリンクを確認する必要があります。特にビデオプレゼンテーションをお勧めします。

最後に、メッセージング/コメントデータベースで考えられる3つのスキーマ(各設計のトレードオフを含む)については、このドキュメントを参照してください。 http://docs.mongodb.org/manual/use-cases/storing-comments /

5
William Z

私の提案を見つけてください:

    Person : {
        person_id: '123',
        last_login: 12.06.2008,
        online: true
    }

Conversation : {
 conversation_id: append the greater person_id to the lower person_id, // person_1_id =123 and person_2_id =124 then its 123124

messages: [ 
        { message_id: 1, 
          message_text : 'Hi what's up',
          sender_id : 123,
          receiver_id: 124,
          timestamp : 12344567891
        },
        { message_id: 2, 
          message_text : 'fine',
          sender_id : 124,
          receiver_id: 123,
          timestamp : 12344567891
        }
       ]
}
0
Anoop Abraham