卡桑德拉 - 一张大桌子和许多桌子

时间:2016-09-29 12:25:32

标签: database-design cassandra datastax

我目前正在尝试使用Cassandra数据库。 我正在使用DataStax开发中心和DataStax C#驱动程序。

My Current模型非常简单,仅包含:

  • ParameterId(int) - 将作为表的id。
  • 价值(bigint)
  • MeasureTime(时间戳)

我将拥有1000(不多于,不少于)参数,从1到1000.并且每次参数将获得一个条目。第二,并将运行多年。

我的问题是关于创建表格是否更好的做法:

CREATE TABLE keyspace.measurement (
    parameterId int,
    value bigint,
    measureTime timestamp,
    PRIMARY KEY(parameterId, measureTime)
) WITH CLUSTERING ORDER BY (measureTime DESC)

或者最好创建1000个仅包含值和measureTime的表,如果是这样,我可以在我的MeasureTime上查询范围吗?

2 个答案:

答案 0 :(得分:5)

你要打这么宽的行。我会反对你的表格格式,我会选择一些允许你控制行宽度的东西。

根据您的查询要求,我会给您写一个更合适的架构(恕我直言):

CREATE TABLE keyspace.measurement (
    parameterId int,
    granularity timestamp,
    value bigint,
    measureTime timestamp,
    PRIMARY KEY((parameterId, granularity), measureTime)
) WITH CLUSTERING ORDER BY (measureTime DESC)

这与您的非常相似,但它有一个主要优势:您可以配置行的宽度,而且您没有任何热点。这个想法很简单:parameterIdgranularity字段都会生成分区键,因此它们会告诉您数据的去向,而measureTime会保留您的数据订购。假设您希望每天查询,您可以将[{1}}的{​​{1}}值granularity存储到yyyy-mm-dd中,将当天的所有指标组合在一起。

这允许您使用有效的范围查询检索位于同一分区上的所有值(因此,对于给定的measureTimeparameterId字段对)。在日常配置中,您最终会得到每个分区86400条记录。这个数字可能仍然很高(建议的限制是10k IIRC),您可以通过使用granularity值进行逐小时分组来降低该值。

这种方法的缺点是,如果您需要来自多个分区的数据(例如,您每天都要进行分组,但是您需要连续两天的数据,例如1月19日的最后6个小时,以及在1月20日的前6个小时),那么你需要执行多个查询。

答案 1 :(得分:0)

我们这里有两种方法,每种方法各有利弊。

  

方法1:为每个参数创建1个表(1000个表仅包含   一个值和measureTime)

如果我们在不久的将来只有有限数量的参数,如果我们需要容纳更多参数,那么每种参数创建一个表将变得很麻烦,这种方法会很好。通过将表放在不同的分片中可以提高性能。

  

方法2:创建一个大表

NoSql DB的设计旨在为更高数量的记录提供更好的性能。即使拥有数十亿的记录也会带来良好的表现。

考虑到这一点"will be getting an entry for each parameter once pr. second and will be running for years.",我认为方法1最适合您的场景,前提是未来参数数量不会增加。