6

我们想使用 cassandra 来存储复杂的数据
,但我们不知道如何组织索引。

我们的表(列族)如下所示:

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

我们的查询包含必填字段(名字、姓氏、年龄)和额外的搜索选项(国家、ChildCount)。
我们应该如何组织索引以使这种查询更快?

首先我想,在(名字,姓氏,年龄)上创建复合索引并在剩余字段(国家和儿童计数)上添加单独的二级索引是很自然的。
但是创建二级索引后我无法将行插入表中,也无法查询该表。

使用

  • 卡桑德拉 1.1.0
  • 带有 --cql3 选项的 cqlsh。

欢迎任何其他解决我们问题的建议(具有强制性和附加选项的复杂查询)。

4

2 回答 2

2

This is my idea. You could simply create a column family with your RandomId as the row key and all the remaining fields simply as columns (e.g. column name 'firstname', column value 'jonh'). After this you have to create a secondary index for each of these columns. The cardinality of your values seems to be low so it should be slightly efficient.

THe CQL code should be something like:

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]];

A good reference for it could be http://www.datastax.com/docs/0.7/data_model/secondary_indexes

Let me know if I'm wrong;

于 2012-06-01T20:36:13.470 回答
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)
);
于 2015-12-29T19:40:20.317 回答