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