Apache Cassandra:为小表建模

Posted

技术标签:

【中文标题】Apache Cassandra:为小表建模【英文标题】:Apache Cassandra: Modelling a small table 【发布时间】:2015-09-22 11:03:59 【问题描述】:

对行数有限的列族建模的最佳做法是什么?

例如,我有下表:

 CREATE TABLE product (
    productname text PRIMARY KEY,
    productdescription text,
    updatedts timestamp,
    updateduser text);

此表在其生命周期内最多可以有 100 行。如果我将 productname 作为分区键,那么这 100 行将位于不同的分区中,这是低效的。我想让整个数据驻留在一个分区中。

一般设计具有有限行的表格的最佳做法是什么?

PS:假设将在此表上运行的唯一查询是:

select productname,productdescription,updatedts,updateduser from product;

【问题讨论】:

在不知道所需查询模式的情况下,很难知道如何最好地设计您的表。但我可以告诉你,将所有行放在一个分区中不是最佳做法。 更新了将要使用的查询。我知道这不是最佳做法,但我相信在这种特殊情况下,对小数据进行分区会适得其反。 【参考方案1】:

基于“我知道这不是最佳实践,但我相信在这种特殊情况下,对小数据进行分区会适得其反。”让我们继续:

您可以添加常量值作为主键,例如将表名始终设置为“产品”。

CREATE TABLE product (
    tablename text,
    productname text,
    productdescription text,
    updatedts timestamp,
    updateduser text,
    PRIMARY KEY(tablename, productname));

更多的是,因为列数对于 cassandra 来说不是问题,因为您可以在一个大表中“按下”这样的“小”表(您需要在每个表中只有一个主键,并且类型必须是一样):

假设您有 3 个“小”表:

CREATE TABLE product (
    productname text PRIMARY KEY,
    productdescription text,
    updatedts timestamp,
    updateduser text);


CREATE TABLE hellokitty (
    kittyname text PRIMARY KEY,
    age int,
    owner text);


CREATE TABLE pandarianians (
    name text PRIMARY KEY,
    pandariantime timestamp,
    age int);

然后您可以将所有 3 个放在一个分区中,每个表都在一个分区中:

CREATE TABLE lifeislife(
    tablename text, 
    tablekey text,
    updatedts timestamp,
    updateduser text,
    age int,
    owner text,
    pandariantime timestamp,
    PRIMARY KEY (tablename, tablekey)
)  

您的选择是:

select tablekey,productdescription,updatedts,updateduser from lifeislife where tablename="product";

【讨论】:

以上是关于Apache Cassandra:为小表建模的主要内容,如果未能解决你的问题,请参考以下文章

在 Cassandra 中使用轻量级事务 (CAS) 时,我们如何避免丢失写入?

com.datastax.oss -> java-driver-core 和 com.datastax.cassandra -> cassandra-driver-core 之间的 Cas

Cassandra 数据建模分区键

cassandra 中的数据建模和查询

Cassandra 中的数据建模冲突

带有排序查询建模的Cassandra过滤器