2017-01-30 14 views
2

node_id、node_name、dataというテーブルがあります。私の要件はgetByIDとgetByNameです。だから私は主キーとしてIDと名前を作った。しかし、時には名前を更新する必要もあります。主キー値の更新Cassandra

私はCassandraが主キーの更新とWHERE句の非主キーの使用を許可しないことを知っています。

どうすればこの問題を解決できますか?

最初にレコードを削除してから、同じIDと新しい名前で再度挿入することを検討しました。しかし、私はこれが墓石を作り、パフォーマンスに影響を与えることを読んだ。

答えて

-1
create table users_by_id_name(
     id int, 
     createdOn bigint, -- timestamp in millisec 
     name text, 
     age int, 
     primary key (id,name,createdOn) 
    )WITH CLUSTERING ORDER BY (name DESC, createdOn DESC); 

上記の表定義を使用してユーザーを挿入します。 挿入クエリ -

insert into users_by_id_name (id,createdOn,name,age) values (1,100,'darthvedar',28); 

ユーザを更新するために、同一のユーザIDと更新された名前とcreatedOn値で再度行を挿入します。

insert into users_by_id_name (id,createdOn,name,age) values (1,200,'obi-wan-kenobi',28); 

クエリの下に、ユーザの使用を選択しながら -

ユーザIDによって選択 - 名前で

select * from users_by_id_name where id=1 limit 1; 

選択ユーザ -

select * from users_by_id_name where name='obi-wan-kenobi' ALLOW FILTERING; 

他の方法は、二次使用することですユーザー名のインデックス。ユーザー名はあまり頻繁に変更されないので、セカンダリインデックスも良い選択肢だと考えてください。コメントの後に

編集 -

ユーザー名に非常に頻繁に更新を持っている場合、2つの異なるテーブルを使用する方が良いでしょう。

create table users_by_id(
    id int, 
    name text, 
    age int, 
    primary key (id) 
); 
    create table users_by_name(
    id int, 
    name text, 
    age int, 
    primary key (name) 
); 

挿入中、バッチステートメントを使用して両方のテーブルに挿入します。

希望すると、これが役立ちます。

+0

"ユーザを更新するには、同じユーザIDと更新された名前とcreatedOn値を持つ行を再度挿入します。 - 主キーの新しい組み合わせを挿入しています。これにより、テーブルに新しいエントリが作成されます。既存のエントリは更新されません。 これは、すべてのエントリをすべて取得する場合に問題になります。 返信いただきありがとうございます。 – Sree

+0

はい、私たちが最新のエントリを取るように、私たちのクエリではlimit 1を使用している理由です。 – Gunwant

+1

何百万というレコードがあり、それらを更新して不要なデータのヒープを作成するときは、これは良いアプローチではないと思います。 – Sree

0

主キーとしてnode_idのみを使用します。 getByNameを実装するには、マテリアライズド・ビューを作成します。 materialized views in cassandra

関連する問題