2016-05-16 20 views
0

カサンドラのデータモデリングでは、「カサンドラではデータの非正規化と複製が実生活です。しかし、標準化されていないデータの欠点の1つは、更新を非常に困難にすることです。たとえば、異なるクエリを扱う3つのテーブルがある場合、選択は問題ありません。しかし、私のアプリでは、私はユーザー名を更新したいと私はこれらの3つのテーブルを更新する必要がありますか?最初のテーブルの更新はOKです。後者はどうですか? upatesは非常に高価になるだろうか?このケースをどのように扱うべきですか?cassandraの更新

CREATE TABLE users_by_username (
    username text PRIMARY KEY, 
    email text, 
    age int 
) 

CREATE TABLE users_by_email (
    email text PRIMARY KEY, 
    username text, 
    age int 
) 

CREATE TABLE groups (
    groupname text, 
    username text, 
    email text, 
    age int, 
    hash_prefix int, 
    PRIMARY KEY ((groupname, hash_prefix), username) 
) 
+0

はい、個別に更新する必要があります。それは計算の点で高価ではありませんが、それはかなり速くなければなりません。少なくとも、それは私が実際に見たものです。 –

+0

しかし、後者は、検索+変更権と同等のarrを更新しますか?実際には非プライマリキーで作業しているので、遅くするべきではありませんか? – Hammer

+1

あなたのアップデートを実行してタイムドされましたか?それが確かに知る方法です。 –

答えて

1

これは、時間の経過とともに更新されているカサンドラにリレーショナルモデルを入れようとする典型的な問題です。カッサンドラは素晴らしいデータベースで、それが何のために、それは不思議に動作します。あらゆる種類の異なるデータモデルを可能にする多くの機能があり、ほぼすべてのユースケースをカバーできます。あなたのユースケースを見ると、なぜカサンドラをリレーショナル・モデルに使用するのでしょうか? カサンドラがあなたのユースケースをカバーするようにしたいのであれば、アップデートを実行してデータを一貫した状態に保つために、アプリケーションレベルで多くの異なる操作を行う必要があります。

+0

これらの例は、cassandra docのものです。あなたは質問の上でより具体的になることができますか? – Hammer

+0

質問ごとに、関連するすべてのテーブルに配置されているユーザーのためにuuidを生成することができます。これにより、複雑なコードの更新を行うことなくユーザーテーブルを更新できます。投稿したテーブルのすべてのユーザー情報を更新するアプリケーションコードを書くこともできますが、複雑になる傾向があります。私がこのようなモデルを持つことを余儀なくされた場合、私はアプリケーションレベルの結合を行い、1つのユーザーテーブルを持つことを好みます。 –

+0

すべてのテーブルでuuidを使用すると、実際のユーザー名を取得するために必要な別のクエリが作成されますか? – Hammer

-1

いくつかのyoutubeクリップを見た後、Canssandraのアップデートは、ファイルシステムのコミットログにレコードを追加する簡単な書き込みのようです。その後、データはcacheandraサーバーにmemtableに置かれ、すぐにクライアントに確認応答が送信されます。更新呼び出しが終了します。これにより、クライアントへの更新が高速になります。

フラッシング、順次書き込み、タイムスタンプに基づくマージなど、コンパクションプロセス全体がその後に発生します。

+0

あなたの質問が「更新の速さ」であれば、答えは「速い」と答えますが、「このモデルを(最初の質問から)維持するのがどれくらい難しいのですか」という質問は、直感的である "。 –

関連する問題