我正在阅读以下有关使用cassandra数据建模的博客:
http://www.ebaytechblog.com/2012/07/16/cassandra-data-modeling-best-practices-part-1/#terms
我试图了解如何使用CQL命令实现或实际执行某些操作。
我对博客/教程中选项3部分的以下图片感兴趣。
我最感兴趣的是实现最底层的两个。
在左下角的图片中,行键是商品ID,列是喜欢该商品的用户。一些如何在教程中显示如何将一个用户存储在密钥中,有点像名称和userID的元组。怎么可能在CQL中做到这一点?令我困惑的是,对于一个用户,该表能够在一行中存储两个列值(即,它存储用户ID以及用户名)。我有点困惑,实际上可以为Cassandra做些什么。从概念上讲,这对我来说是有意义的,但是,我不确定我是否理解如何让cassandra做这样的事情。
答案 0 :(得分:1)
上述示例使用动态单元(内部列)名称(即123,456,111,222)。 您可以使用复合主键在CQL中实现此目的:
cqlsh:test> DESC TABLE user_by_item ;
CREATE TABLE test.user_by_item (
item_id int,
user_id int,
user_name text,
PRIMARY KEY (item_id, user_id)
);
cqlsh:test> select * from user_by_item WHERE item_id = 111;
item_id | user_id | user_name
---------+---------+-----------
111 | 123 | Jay
111 | 456 | John
(2 rows)
cqlsh:test> select * from user_by_item WHERE item_id = 111 and user_id = 123;
item_id | user_id | user_name
---------+---------+-----------
111 | 123 | Jay
(1 rows)
cqlsh:test> DESCRIBE TABLE item_by_user ;
CREATE TABLE test.item_by_user (
user_id int,
item_id int,
item_name text,
PRIMARY KEY (user_id, item_id)
);
cqlsh:test> SELECT * from item_by_user WHERE user_id = 123;
user_id | item_id | item_name
---------+---------+-----------
123 | 111 | iphone
123 | 222 | ipad
(2 rows)
cqlsh:test> SELECT * from item_by_user WHERE user_id = 123 and item_id = 111;
user_id | item_id | item_name
---------+---------+-----------
123 | 111 | iphone
(1 rows)
主键的第一部分将是您的内部行键",第二部分将用作"群集键",即将成为&#34的一部分34;内部细胞/柱"名称。
因此,表格将按照示例中的类似方式进行内部/物理存储,WITH COMPACT STORAGE
选项将为您提供与示例中完全相同的物理布局
请查看http://www.datastax.com/dev/blog/thrift-to-cql3和http://thelastpickle.com/blog/2013/01/11/primary-keys-in-cql.html了解详情。