Cassandra“路径”数据模型

时间:2016-05-04 17:37:31

标签: cassandra data-modeling nosql

我们正在尝试为Cassandra构建数据模型,并且可以选择使用 path 视图而不是经典表/列视图来保存数据。

例如

CREATE TABLE data1 (
  user uuid,
  timestamp timeuuid,
  column1 int,
  column2 int
  primary key (user, timestamp)
)
CREATE TABLE `data2` (
  user uuid,
  timestamp timeuuid,
  column1 int,
  column2 int
  primary key (user, timestamp)
)

成为一个表格,如:

create table all_data (
  user uuid,
  timestamp timeuuid,
  path text,
  value blob
  primary key (user, timestamp, path)
)

我们将数据插入

insert into all_data (user, timestamp, path, value) values (1,0,'data1.column1',1)
insert into all_data (user, timestamp, path, value) values (1,0,'data1.column2',2)
insert into all_data (user, timestamp, path, value) values (1,9,'data2.column1',7)
insert into all_data (user, timestamp, path, value) values (1,9,'data2.column1',8)

这有点类似于石墨收集statsd指标的方式,这种模型的参数是为一列提供具有更好读取性能的基于列的存储,因为我们几乎从不需要获得整行,而是每个用户一列在时间范围内。

有没有人有这种数据模型的经验,它是否真的比经典的更好?你能就此提出任何建议吗?

1 个答案:

答案 0 :(得分:0)

取决于您追求的数据。
如果您想获得[user,timestamp]的所有列,那么您将需要使用第一个模型。一个查询(WHERE user = 1 AND timestamp = 0)将查看一个节点以检索所有列 要使用第二个模型,您必须为每个可能的用户/时间戳/路径组合执行查询。如果只有column1&如果存在column2,则需要2个查询来检索它们(WHERE user = 1 AND timestamp = 0 AND path ='data1.column1')(WHERE user = 1 AND timestamp = 0 AND path ='data1.column2')。每一行都可能位于不同的节点上 第二种模式的性能较差。