为了测试这一点,我创建了上面的PRIMARY KEY的示例模式(使用WITH COMPACT STORAGE
),跑这6个INSERT
S:
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',87,1);
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',87,2);
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',21,3);
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',21,4);
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',44,5);
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',44,6);
注意的是,由于您的主键定义,我结束行动与这三个CQL行:
userid | keyword | score | fid
--------+--------------+-------+-----
3 | Star Wars | 21 | 4
3 | Star Wars | 44 | 6
3 | Star Wars | 87 | 2
(3 rows)
与Cassandra PRIMARY KEYs的事情是,他们是独特的。所以,如果你想确保唯一性到fID,那么你应该确保它是PRIMARY KEY的最后一部分... PRIMARY KEY(用户标识,关键字,分数,fID)这将确保唯一性,并且仍然允许您对通过关键字和分数。
若要查看其在物理层面的结构,我可以使用(而不是cqlsh)的cassandra-cli
:
[[email protected]] use stackoverflow;
Authenticated to keyspace: stackoverflow
[[email protected]] list dontnameyourtableindex ;
Using default limit of 100
Using default cell limit of 100
-------------------
RowKey: 3
=> (name=Star Wars:21, value=4, timestamp=1425307959946184)
=> (name=Star Wars:44, value=6, timestamp=1425307961062608)
=> (name=Star Wars:87, value=2, timestamp=1425307959909671)
注意,WITH COMPACT STORAGE
不断出现的fid
列名,而不是只显示值与相应的列键。
非常感谢您的回答,但现在我完全困惑。为什么你最终只有3行?让我们考虑一个没有列分数的更简单的情况。用户应该保持包含给定关键字的文件标识......在这种情况下,关键字可能包含在数百个文件中。那么你会再次以一个CQL行结束? – user3201666 2015-03-03 14:34:37
@ user3201666编辑。但是,是的,如果您删除了“score”列,那么这6个INSERT只会导致一个CQL行。正如我在上面添加的那样,您可能想要添加'fID'作为PRIMARY KEY的最后一部分,以确保唯一性。 – Aaron 2015-03-03 14:59:35
谢谢@ BryceAtNetwork23。我需要为同一个user_id,关键字和分数保留很多fID。什么是最有效的内存方式?宽行?将fID添加到复合索引?真的需要弄清楚这一点。我的意思是我也不能使用列表作为fID的数量可能会超过限制655536 – user3201666 2015-03-05 13:35:02