2012-03-06 11 views
1

通知のためのデータモデルの設計に関する助けが必要です。ですから、私はCassandraを使い、ユーザーのための通知を保存したいWebページを持っています。 :通知機能のためのCassandraデータモデル設計

  • ユーザーxyzからメッセージを受け取ったが、あなたの写真
  • などを投票...

ユーザーの最後の通知の範囲を取得し、単一の通知を削除する必要があります。だから私は最適なスキーマが必要です(50%の読み込み対50%の書き込み??)。以下

私の考え...(何キーのソートタイムスタンプで??何だと思います):事前に

notifications { 
    john : { 
     111-1123-3242-9202 : {type: 'newmail'; ...; timestamp: 321948293849} 
     555-1123-aaac-ccc3 : {type: 'voted'; ...; timestamp: 321948293433} 
    } 

    anna : {...} 

    ... 
} 

本当にありがとう!

トム

答えて

4

私はなど、あなたのCFで、「ジョン」、「アンナ」「通知」と仮定している行のキーです。

通知ごとのデータが比較的少ないか、または更新する必要がないと仮定して、列名にタイムスタンプを使用し、シリアル化された通知全体(おそらくjson)を列の値に入れることをお勧めします。これにより、最後のN個の通知を非常に効率的に取得し、個々の通知を簡単に削除できるようになります。 pycassaを使用して

、クエリを取得し、削除するには、次のようになります。

def get_notifications_for(user): 
    cols = notifications_cf.get(user, column_count=10) 
    return map(json.loads, cols.values()) 

def delete_notification(user, notification_timestamp): 
    notifications_cf.remove(user, columns=[notification_timestamp]) 

私はあなたの通知を逆時系列に格納されますを意味し、あなたがLongType(reversed=true)であるためにあなたのコンパレータを設定したことをここに仮定しています列名にタイムスタンプを使用している場合は、注文してください。

+0

これは素晴らしいヒントです!ありがとうございます – tomekkup

+0

うーん...もう一度質問をしました。このユースケースでは、Long型をLong型として使用するのは安全ですか?理論的には、重複する列名を生成することは可能です。私はHector&Javaで作業しており、System.currentTimeInMillis()で時間を生成しています。もちろん私はTimeUUIDに変更することができますが、私はする必要があるかどうかはわかりません。 – tomekkup

+0

はい、衝突が心配な場合は、代わりにTimeUUIDを使用してください。それは完全にうまくいくでしょう。 –

関連する問題