1

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

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

我试图了解如何使用 CQL 命令实现或实际执行其中的一些内容。

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

在此处输入图像描述

我主要对实现底部的两个感兴趣。

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

4

1 回答 1

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)

您的主键的第一部分将是您的“内部行键”,第二部分将用作“集群键”,即作为“内部单元格/列”名称的一部分。因此,表格将以与您的示例类似的方式在内部/物理上存储,并且WITH COMPACT STORAGE选项将为您提供与示例中完全相同的物理布局

看看http://www.datastax.com/dev/blog/thrift-to-cql3http://thelastpickle.com/blog/2013/01/11/primary-keys-in-cql.html _更多细节。

于 2014-03-28T23:18:42.587 回答