bra*_*orm 13 cql3 secondary-indexes cassandra-2.0
我一再听说二级索引(在cassandra中)只是为了方便而不是为了获得更好的性能.建议在基数较低时使用二级索引的唯一情况(例如性别column为男性或女性的两个值)
考虑这个例子:
CREATE TABLE users (
userID uuid,
firstname text,
lastname text,
state text,
zip int,
PRIMARY KEY (userID)
);
Run Code Online (Sandbox Code Playgroud)
现在,除非我在users on上创建二级索引,否则我无法执行此查询firstname index
select * from users where firstname='john'
Run Code Online (Sandbox Code Playgroud)
如何对此表进行非规范化,以便我可以使用此查询:这是使用复合键的唯一有效方法吗?还有其他选择或建议吗?
CREATE TABLE users (
userID uuid,
firstname text,
lastname text,
state text,
zip int,
PRIMARY KEY (firstname,userID)
);
Run Code Online (Sandbox Code Playgroud)
med*_*oma 19
为了提出一个好的数据模型,您需要确定要执行的第一个ALL查询.如果您只需要按名字(或名字和用户ID)查找用户,那么您的第二个设计就好了...
如果您还需要按姓氏查找用户,则可以创建另一个表,该表具有相同的字段,但主键位于(lastname,userID).显然,您需要在同一时间更新两个表.数据重复在Cassandra中很好.
但是,如果您担心两个或更多表所需的空间,您可以创建一个按用户标识分区的单个用户表,以及要查询的字段的其他表:
CREATE TABLE users (
userID uuid,
firstname text,
lastname text,
state text,
zip int,
PRIMARY KEY (userID)
);
CREATE TABLE users_by_firstname (
firstname text,
userid uuid,
PRIMARY KEY (firstname, userid)
);
Run Code Online (Sandbox Code Playgroud)
此解决方案的缺点是您需要两个查询来按用其名字检索用户:
SELECT userid FROM users_by_firstname WHERE firstname = 'Joe';
SELECT * FROM users WHERE userid IN (...);
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助