我们想用cassandra来存储复杂的数据 但我们无法弄清楚如何组织索引。
我们的表(列族)如下所示:
Users =
{
RandomId int,
Firstname varchar,
Lastname varchar,
Age int,
Country int,
ChildCount int
}
我们有必填字段(名字,姓氏,年龄)和额外搜索选项(Country,ChildCount)的查询。
我们应该如何组织索引以更快地进行此类查询?
首先我想,在(名字,姓氏,年龄)上创建综合索引并在剩余字段(Country和ChildCount)上添加单独的二级索引是很自然的。
但是在创建二级索引后我无法在表中插入行,我无法查询该表。
使用
欢迎任何其他解决我们问题的建议(带有强制性和附加选项的复杂查询)。
答案 0 :(得分: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 :(得分: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)
);