【问题标题】:How Cassandra stores multicolumn primary key (CQL)Cassandra 如何存储多列主键 (CQL)
【发布时间】:2013-07-16 07:59:41
【问题描述】:

我对 Cassandra 中使用 CQL 的复合行键有一点误解。 假设我有以下内容

cqlsh:testcql> CREATE TABLE Note (
           ... key int,
           ... user text,
           ... name text
           ... , PRIMARY KEY (key, user)
           ... );
cqlsh:testcql> INSERT INTO Note (key, user, name) VALUES (1, 'user1', 'name1');
cqlsh:testcql> INSERT INTO Note (key, user, name) VALUES (1, 'user2', 'name1');
cqlsh:testcql>
cqlsh:testcql> SELECT * FROM Note;

 key | user  | name
-----+-------+-------
   1 | user1 | name1
   1 | user2 | name1

这些数据是如何存储的?有 2 行还是 1 行。

如果是两个,那么如何可能有多个具有相同键的行? 如果一个然后有 key=1 和用户从“u​​ser1”到“user1000”的记录,这是否意味着它将有一行 key=1 和 1000 列包含每个用户的名称?

有人能解释一下后台发生了什么吗?谢谢。

【问题讨论】:

    标签: cassandra cql


    【解决方案1】:

    所以,在深入挖掘并Lyuben Todorov 建议的reading an article(谢谢)之后,我找到了我的问题的答案。

    Cassandra 将数据存储在称为行的数据结构中,这与关系数据库完全不同。行有一个唯一的键。

    现在,我的示例中发生了什么...在表Note 中,我有一个组合键定义为PRIMARY KEY (key, user)。只有这个键的第一个元素充当行键,它被称为分区键。在内部,此键的其余部分用于构建复合列。

    在我的例子中

     key | user  | name
    -----+-------+-------
       1 | user1 | name1
       1 | user2 | name1
    

    这将在 Cassandra 中的一行中表示为

    -------------------------------------
    |   | user1:name    | user2:name    |
    | 1 |--------------------------------
    |   | name1         | name1         |
    -------------------------------------
    

    很明显,将具有大量唯一值(并且不断增长)的任何列添加到复合键中并不是一个好主意,因为它将存储在一行中。如果您在复合主键中有多个这样的列,那就更糟了。

    更新:后来我发现this blog post by Aaron Morton 比解释更详细。

    【讨论】:

    • 博文不再存在 =(
    • @Highstead 更新了指向该博文新地址的链接
    猜你喜欢
    • 2013-08-27
    • 2013-07-16
    • 2016-09-16
    • 2014-03-27
    • 2012-02-21
    • 2014-04-04
    • 1970-01-01
    • 2015-02-24
    • 2014-11-01
    相关资源
    最近更新 更多