2016-05-04 9 views
1

Cassandraを初めて使用し、メッセージングシステムのデータモデルを構築しようとしています。私はいくつかのソリューションを見つけましたが、どれも自分の要件に正確には一致しません。Cassandraを使用したメッセージングシステムの設計データモデル

  1. は、時間によってソートされたすべての他のユーザーから、特定のユーザーのための最後のメッセージのリストを取得します。二つの主な要件があります。
  2. 1対1のメッセージ履歴のメッセージのリストを取得し、時刻順に並べ替えます。
  3. 私はこのような何かを考え

CREATE TABLE chat (
    to_user text, 
    from_user_text, 
    time text, 
    msg text, 
    PRIMARY KEY((to_user,from_user),time) 
) WITH CLUSTERING ORDER BY (time DESC); 

しかし、私はこのデザインは、同様from_user渡す必要があるため最初の要件を満たすことができる文句を言わないように、この設計は、いくつかの問題があります。また、(to_user、from_user)の数が増えると効率が悪くなります。

答えて

1

あなたは正しいです。その1つのテーブルは両方のクエリを満たさないため、2つのテーブルが必要です。クエリごとに1つ。これはCassandraデータモデリングのコアコンセプトです。クエリ駆動型設計。

ので、クエリは、ユーザーへのメッセージを探して:他のユーザーへのユーザーから

CREATE TABLE chat (
    to_user text, 
    from_user_text, 
    time text, 
    msg text, 
    PRIMARY KEY((to_user),time) 
) WITH CLUSTERING ORDER BY (time DESC); 

メッセージ。

あなたとは少し異なる:from_userはクラスタリング列であり、パーティションキーの一部ではありません。これにより、アプリケーションコードで必要な選択クエリの量が最小限に抑えられます。

両方のクエリを満たすために2番目のテーブルを使用することはできますが、時間の範囲クエリを使用するには 'from_user'を指定する必要があります。

+0

ご回答ありがとうございます。それは私の両方の要件を満たすでしょう。しかし最初のテーブルはすべてのfrom_usersからのすべてのメッセージを時間でソートしてくれます。つまり、異なるfrom_usersからメッセージを一意に取得することはできません。それを達成する方法はありますか? –

+0

2番目のテーブルでこれを行うことができます。 'select * from chat to_user =' X '、from_user =' Y '; –

+0

from_user = Yだけでなく、すべてのユーザーを確認したいと思います。 fbメッセンジャーのように、すべてのfrom_usersの最後のメッセージだけがタイムリーに表示されます。 –

関連する問題