2011-10-17 10 views
2

私はデータベースバックエンドとしてCouchDBを使用する(単純な)twitter-cloneを構築しようとしています。 機能が少なくなったため、ほとんどのコーディングが終了しましたが、私はCouchDBで解決できない1つの事柄、つまりユーザーごとのタイムラインがあります。CouchDBで(単純な)twitter-cloneを構築する

twitterと同様に、ユーザーごとのタイムラインには、私がフォローしているすべての人のつぶやきが時間順に表示されるはずです。 SQLでは非常に単純なSelect-Statementですが、CouchDBs Map/Reduceでこれを再現する方法はわかりません。

ここで私はRDBMSで使用するSQL文です:

SELECT * FROM tweets WHERE user_id IN [1,5,20,33,...] ORDER BY created_at DESC; 

CouchDBのスキーマの詳細

ユーザー・スキーマは:

{ 
    _id:xxxxxxx, 
    _rev:yyyyyy, 
    "type":"user", 
    "user_id":1, 
    "username":"john", 
    ... 
} 

つぶやきスキーマ:

{ 
"_id":"xxxx", 
"_rev":"yyyy", 
"type":"tweet", 
"text":"Sample Text", 
"user_id":1, 
... 
"created_at":"2011-10-17 10:21:36 +000" 
} 

view collationsでは、CouchDBに「user_id = 1のすべてのつぶやき」のリストを時間順に照会するのは簡単です。

しかし、「ID 1,2,3のユーザーに属しているすべてのつぶやき」のリストを時間順に検索するにはどうすればよいですか?私のアプリケーションに別のスキーマが必要ですか?

答えて

0

これを行うための最善の方法は、タイムスタンプとしてcreated_atを保存し、ビューを作成し、user_idにすべてのツイートをマップに次のようになります。

function(doc){ 
    if(doc.type == 'tweet'){ 
    emit(doc.user_id, doc); 
    } 
} 

次に、ユーザーのidのでビューを照会キーとして使用し、アプリケーションでは必要に応じてソートします(ほとんどの場合、配列のソート方法があります)。CouchDBの中でそれをすべてを作るしようとしていた...リビジョンを参照してください:)

+0

私は申し訳ありませんが、それはだ - 前回が

編集1悪い習慣。 reduce関数では小さくて単純な値に減らしているわけではありません。それは関数の使用を減らす方法ではありません。 –

+0

私はそれが "reduce_overflow_error"を発生させる理由だと思います – Railsmechanic

+0

ここで、reduce関数を削除し、マップ関数を変更しました。 @PartlyCloudy私はそれのような削減を使用すべきではありません、幸せ今? – Shedokan

0

これはCouchDB専用アプリですか?あるいは、追加のビジネスロジックのために、間に何かを使用していますか?後者の場合、複数のクエリを実行することでこれを実現できます。

さまざまなビューをマージすることがあります。もう一つのアプローチは、各ツイートに対して「私的な読者」のリストを追加することです。これは、ユーザ固有の(部分的な)ビューを可能にするだけでなく、新しいツイートごとにリーダのリストを追加したり、新しいフォロワーやアンフォロー操作の場合にリストを更新するという複雑さをもたらします。

可能な操作とその頻度について考えることが重要です。だから、つぶやきのリストを生成するときは、リーダの情報をドキュメントに統合する方法(つまり、読者をツイートのドキュメントに統合する方法)に複雑さをシフトさせ、効率的なビューインデックスを簡単に作成する方が良いでしょう。

データに多くの変更を加えた場合は、既存のドキュメントを同時に更新しないようにデータベースを設計することをお勧めします。代わりに、新しい文書を追加してデータを追加し、複雑なビューを介して集計してみてください。

しかし、単純な(1次元の)リストベースのインデックスでは不十分な場合があります。実際には、時間とユーザーIDでフィルタリングするためにセカンダリインデックスが必要です(両方の部分範囲が必要であるという事実を考慮すれば)。しかしこれはCouchDBでは不可能なので、 "クエリ"データをドキュメントにシフトしてビューを構築するときに使用する必要があります。

+0

私は、ビジネスロジックのためシナトラ(ルビー)を使用して... – Railsmechanic

関連する問題