2017-01-07 3 views
1

チャットデータを保存するためにcassandraを使用しています。すべてのユーザーの会話を維持し、受け取ったメッセージに基づいてそれらを並べ替える必要があります。カサンドラ:ユーザーの最近のカバーを表示

会話: 2人以上のユーザーの間でメッセージのストリームです。会話は終わりがなく、連続しています。

会話の作成時間に基づいて、「会話からのユーザー:」のテーブルを維持しています。しかし、受け取ったメッセージに基づいてソートしたいと思っています。

ソリューション

  • ソリューション-1:

私は、マテリアライズド・ビューを使用することを示唆して同様の質問Cassandra: List 10 most recently modified records

を見てきました。メッセージのような頻繁に更新されるレコードでは、このアプローチは問題ありません。

  • 解決策-2: 別の表を使用して、user_recentconversationsをリストに保持します。メッセージがユーザーに送受信されるときに、リストを更新します。

どのような解決策を提案してください。

+0

年代順に「グローバルに」並べ替えてもよろしいですか?それとも、会話で会話を並べ替えるのですか? – xmas79

+0

すべてのユーザーの会話を並べ替える必要があります。グローバルにソートする必要はありません。 whatsappの会話と同様に、会話の中に新しいメッセージがあるとすぐに最新の会話が上に来るはずです。 –

+0

私の答えとあなたのコメントの後、私はあなたの質問がはっきりしないと思う。さらに、Cassandra-2.1を使用していますが、提案されたソリューション1では、Cassandra 3.0でのみ使用可能なマテリアライズド・ビューが示唆されています。 – xmas79

答えて

0

あなたが実際に望むのは、すべてのメッセージをグローバルに並べ替えることです。実際、最新のメッセージで会話をソートするということは、すべてのメッセージも並べ替えることを意味します。メッセージは、あなたがそれを格納到着するたびに

CREATE TABLE conversations_by_most_recent_message (
    conversation_id int, 
    ts timestamp, 
    message text, 
    PRIMARY KEY (conversation_id, ts) 
) WITH CLUSTERING ORDER BY (ts DESC); 

あなたの問題を解決する簡単な方法は、あなたが会話を注文する目的のために、各到着したメッセージを保存し、別のテーブルを作成することです。この表では、各会話に関連するすべてのメッセージが時間順に逆順に並べられます。この表からデータを取得すると、会話ごとに最後のメッセージのタイムスタンプを知るのに役立ちます。あなたがする必要がある

第二段階は、各パーティションから最新のレコードを取得しているが、これは簡単にカサンドラ3.6で導入されたPER PARTITION LIMIT句を悪用し解決することができます:

SELECT * FROM conversations_by_most_recent_message PER PARTITION LIMIT 1; 

これが最初のレコードのみを取得します各パーティションから、それは各会話からの最新のメッセージだけです。

最後のステップは、アプリケーションレベルで取得された行を(タイムスタンプdescで)ソートすることです。

+0

ユーザーごとに会話を取得する必要があるので、これはすべてのユーザーのすべての異なるパーティションを取得するので機能しません。また、cassandra 2.1も使用しています。 –

関連する問題