2012-02-17 22 views
0

私はMongoDBを比較的新しくしており、これまでのところ本当に感銘を受けています。私はドキュメントストアをセットアップする最善の方法に苦労しています。私はTwitterのデータを使っていくつかの要約分析をしようとしています。ユーザーのドキュメントにツイートを入れるのか、それとも別のコレクションにするのかはわかりません。ユーザーのモデルの中につぶやくようなものは、サイズに関してはすぐに限界に達するだろう。そうであれば、ユーザーのつぶやきのグループ全体でMapReduceを実行するにはどうすればよいでしょうか?多数の内部文書を持つMongoDBのデータ構造

私はあまりにも漠然としていないと思っていますが、私はドメインモデルを設定する限り、あまりにも具体的で、あまりにも遠くに間違った道を踏み出すことを望んでいません。

私はあなたが公聴会のすべての退屈している確信しているように、私は次のようになり、私はそれはモンゴで論理スキーマのように思える

| USER | 
-------- 
|ID 
|Name 
|Etc. 

|TWEET__| 
--------- 
|ID 
|UserID 
|Etc 

ように私のスキーマをレイアウトうRDBの土地に慣れ

User 
|-Tweet (0..3000) 
    |-Entities 
    |-Hashtags (0..10+) 
    |-urls (0..5) 
    |-user_mentions (0..12) 
    |-GeoData (0..20) 
|-somegroupID 

しかし、それはすぐに容量を超えてユーザ文書を膨らませません。しかし、同様のsomegroupIDを持つユーザーに属するつぶやきについて分析したいと思います。上記のモデルレイアウトには概念的には意味がありますが、どちらの点があまりにも不揃いですか?そして実行可能な選択肢は何ですか?

答えて

1

すべてのクレジットを。 com。私の質問はhttps://groups.google.com/d/msg/mongodb-user/OtEOD5Kt4sI/qQg68aJH4VIJ

クリスWinslett @ MongoHQ


にオーバー答えたあなたは、このビデオが面白い見つける:

http://www.10gen.com/presentations/mongosv-2011/schema-design-at-scale

基本的に、一つの文書、店舗1に1つのつぶやきの日 人。推論:

{user_idは:1日付:1}#日を最後にする必要がある

  • 通常、照会が

したがって日とユーザーで構成されて、次のインデックスを持つことができますあなたが範囲 と日付上にソートするので

楽しんでください!

クリスMongoHQ


私はそれは次のように実装するのが最も理にかなっていると思う:

ユーザー

{ user_id: 123123, 
    screen_name: 'cledwyn', 
    misc_bits: {...}, 
    groups: [123123_group_tall_people, 123123_group_techies, ], 
    groups_in: [123123_group_tall_people] 
} 

つぶやき

{ tweet_id: 98798798798987987987987, 
    user_id: 123123, 
    tweet_date: 20120220, 
    text: 'MongoDB is pretty sweet', 
    misc_bits: {...}, 
    groups_in: [123123_group_tall_people] 
} 
1

ここでは、16MBのMongoDBドキュメントの制限に準拠していると思います。どのような分析を実行したいのかを言っているわけではないので、スキーマを推薦するのは難しいです。 MongoDBスキーマは、データクエリ(および挿入)パターンを念頭に置いて設計されています。

あなたのつぶやきをユーザに入れておくのではなく、逆にして、ユーザIDとグループIDをツイートドキュメント自体に追加することはもちろん簡単です。その後、ユーザーから追加のフィールドが必要な場合は、表示されたときにいつでも2番目のクエリでそのフィールドを取得できます。

私はとつぶやきドキュメントのデザインを意味する:

 
{ 
    'hashtags': [ '#foo', '#bar' ], 
    'urls': [ "http://url1.example.com", 'http://url2.example.com' ], 
    'user_mentions' : [ 'queen_uk' ], 
    'geodata': { ... }, 
    'userid': 'derickr', 
    'somegroupid' : 40 
} 

し、ユーザーの収集のために、文書は次のようになります。MongoHQで罰金の人々に

 
{ 
    'userid' : 'derickr', 
    'realname' : Derick Rethans', 
    ... 
} 
+0

私は「私は似たsomegroupIDを持つユーザーに属するツイートの分析を実行したいと思います」言及しませんでした。そのグループでトラッキングされるすべてのツイートに「somegroupID」要素を追加するために挿入パターンを破ることはありませんか?そうすれば、その部分集合のmapReduce/analysisを実行することが明らかになります。 – Lloyd

+0

「挿入パターン」とは何を意味するのか分かりませんし、どのような分析をしたいのかは言及していません。いずれにしても、通常のクエリで分析を行うことができれば、M/Rを避けたいでしょう。 – Derick

+0

私はデータを更新するためのベストプラクティスを意味しました。ユーザーが別のユーザーの「somegroupID」に追加された場合、そのユーザーに関連付けられたすべてのツイート文書にそのsomegroupIDを挿入する必要があります。挿入に高いオーバーヘッドのようです。次に、通常のクエリで分析することに関して、MongoはGROUP BYでcount()のようなことをしますか? 1日あたりのつぶやき数などを取得するには? – Lloyd

関連する問題