2012-05-31 30 views
6

複雑なデータを格納するためにcassandraを使用したいが、
インデックスの整理方法はわからない。複合インデックスとセカンダリを併用するCassandra

私たちのテーブル(列ファミリー)は次のようになります。

Users = 
    { 
    RandomId int, 
    Firstname varchar, 
    Lastname varchar, 
    Age int, 
    Country int, 
    ChildCount int 
    } 

私たちは、必須フィールド(ファーストネーム、姓、年齢)と、余分な検索オプション(国、ChildCount)でクエリを持っています。
この種のクエリをより速くするためにインデックスをどのように整理すればよいですか?

最初に、(Firstname、Lastname、Age)でコンポジットインデックスを作成し、残りのフィールド(CountryとChildCount)に別のセカンダリインデックスを追加するのは自然なことだと思っていました。
しかし、私は二次インデックスを作成した後にテーブルに行を挿入することができず、テーブルをクエリできません。 --cql3オプション付き

  • カサンドラ1.1.0
  • cqlshを使用して

私たちの問題(必須オプションと追加オプションの複雑なクエリ)を解決するための他の提案は歓迎します。

答えて

2

これは私の考えです。 RandomIdを行キーとして、残りのすべてのフィールドを単に列(たとえば、列名 'firstname'、列値 'jonh')として列ファミリを作成するだけです。その後、これらの列のそれぞれに対してセカンダリインデックスを作成する必要があります。あなたの値のカーディナリティは低いようですので、やや効率的です。

CQLコードのようなものでなければなりません:

create column family users with comparator=UTF8Type and column_metadata=[{column_name: firstname, validation_class: UTF8Type,index_type: KEYS}, 
{column_name: lastname, validation_class: UTF8Type, index_type: KEYS}, 
{column_name: contry, validation_class: IntegerType, index_type: KEYS}, 
{column_name: age, validation_class: IntegerType, index_type: KEYS]}, 
{column_name: ChildCount, validation_class: IntegerType, index_type: KEYS]]; 

それはhttp://www.datastax.com/docs/0.7/data_model/secondary_indexes

は私が間違っている場合は、私に教えてください可能性のための適切な参照。

1

多数のパーティションを含むクエリの場合、インデックスはあまり効率的ではありません。

あなたが作成したいと思うクエリに基づいてテーブルを考える方が良いと思います。ユーザ名に基づいたクエリのテーブルが必要で、それはユーザに関するすべての情報を格納する正しい場所のようです。一方、あなたは、ユーザーのリストを提供することを前提とした国に基づいて検索することができるようにしたいと考えています。そのためには、実際にすべての情報を必要とせず、おそらく姓と名、別のテーブルでそれを行うことができます。

これはデータの重複を伴​​いますが、Cassandraのデータモデリングの考え方に適しています。

これは与えるだろう:

CREATE TABLE users(
    id UUID, 
    lastname TEXT, 
    firstname TEXT, 
    age INT, 
    country TEXT, 
    childcount INT, 
    PRIMARY KEY(UUID) 
); 

CREATE TABLE users_by_country(
    country TEXT, 
    firstname TEXT, 
    lastname TEXT, 
    user_uuid UUID, 
    PRIMARY KEY((country), firstname, lastname) 
); 

CREATE TABLE users_by_age(
    age INT, 
    firstname TEXT, 
    lastname TEXT, 
    user_uuid UUID, 
    PRIMARY KEY((age), firstname, lastname) 
); 
関連する問題