如何在不实际存储列表的情况下将cassandra存储值的元组放在一行中?这甚至可能吗?

时间:2014-03-28 22:23:39

标签: cassandra cql cassandra-2.0

我正在阅读以下有关使用cassandra数据建模的博客:

http://www.ebaytechblog.com/2012/07/16/cassandra-data-modeling-best-practices-part-1/#terms

我试图了解如何使用CQL命令实现或实际执行某些操作。

我对博客/教程中选项3部分的以下图片感兴趣。

enter image description here

我最感兴趣的是实现最底层的两个。

在左下角的图片中,行键是商品ID,列是喜欢该商品的用户。一些如何在教程中显示如何将一个用户存储在密钥中,有点像名称和userID的元组。怎么可能在CQL中做到这一点?令我困惑的是,对于一个用户,该表能够在一行中存储两个列值(即,它存储用户ID以及用户名)。我有点困惑,实际上可以为Cassandra做些什么。从概念上讲,这对我来说是有意义的,但是,我不确定我是否理解如何让cassandra做这样的事情。

1 个答案:

答案 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-cql3http://thelastpickle.com/blog/2013/01/11/primary-keys-in-cql.html了解详情。