我目前正在尝试使用Cassandra数据库。 我正在使用DataStax开发中心和DataStax C#驱动程序。
My Current模型非常简单,仅包含:
我将拥有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上查询范围吗?
答案 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)
这与您的非常相似,但它有一个主要优势:您可以配置行的宽度,而且您没有任何热点。这个想法很简单:parameterId
和granularity
字段都会生成分区键,因此它们会告诉您数据的去向,而measureTime
会保留您的数据订购。假设您希望每天查询,您可以将[{1}}的{{1}}值granularity
存储到yyyy-mm-dd
中,将当天的所有指标组合在一起。
这允许您使用有效的范围查询检索位于同一分区上的所有值(因此,对于给定的measureTime
和parameterId
字段对)。在日常配置中,您最终会得到每个分区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最适合您的场景,前提是未来参数数量不会增加。