35

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

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

  1. ユーザー (ユーザー名、電子メール、パスワードなど)
  2. 連絡先リスト (さまざまな連絡先または連絡先グループを含む)
  3. The conversation (会話とは、何人かの人々の間のメッセージの集まりです)
  4. メッセージ (メッセージ本文、タイムスタンプ、および作成者が含まれます。)

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

1. ユーザー

{
    username: 'dev.puS',
    usernameCanonical: 'dev.pus', // used for unique constraints
    email: 'developement.pus@gmail.com,
    emailCanonical: 'developement.pus@gmail.com,
    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' }
    ]
}

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

ドキュメントごとに更新頻度が異なるため、それらを別々に保持する方がよいと思います(したがって、各ドキュメントは独自のものになります)。しかし、私は実際にそれについての経験がないので、アドバイスを聞くのは良いことです:)

よろしく

4

4 に答える 4

23

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

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 人が互いにメッセージをやり取りする場合)。

于 2016-05-25T01:31:01.300 に答える
8

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

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

最後に、各設計のトレードオフを含む、メッセージング/コメント データベースの 3 つの可能なスキーマの説明については、おそらくこのドキュメントを参照する必要があります: http://docs.mongodb.org/manual/use-cases /保存コメント/

于 2012-06-27T18:23:43.690 に答える
-2

これは私の提案です

{
"_id" : ObjectId("5a9e9581a2147c0c0f00002e"),
"id_members1" : "5a9e9581a2147c0c0f02345t",
"id_members2" : "5a9e9581a2147c0c0f02134g",
"name" : [ 
    "Omar", 
    "Mohamed"
],
"messages" : [ 
    {
        "author" : "Omar",
        "body" : "salam 3likom",
        "create_at" : ISODate("2018-03-07T09:04:04.000Z")
    }, 
    {
        "author" : "Mohamed",
        "body" : "Wa3likom salam",
        "create_at" : ISODate("2018-03-07T09:04:04.000Z")
    }, 
    {
        "author" : "Mohamed",
        "body" : "wach teshak",
        "create_at" : ISODate("2018-03-07T09:04:04.000Z")
    }, 
    {
        "author" : [ 
            "Omar", 
            "Mohamed"
        ],
        "body" : "test msg",
        "create_at" : ISODate("2018-03-25T15:30:05.000Z")
    }
],
"comments" : [ 
    null, 
    {
        "author" : [ 
            "Omar", 
            "Mohamed"
        ],
        "body" : "test msg",
        "create_at" : ISODate("2018-03-25T15:28:11.000Z")
    }, 
    {
        "author" : [ 
            "Omar", 
            "Mohamed"
        ],
        "body" : "test msg",
        "create_at" : ISODate("2018-03-25T15:28:31.000Z")
    }
]

}

于 2018-03-25T16:37:29.907 に答える