Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 卡桑德拉-一张大桌子vs多张桌子_Database Design_Cassandra_Datastax - Fatal编程技术网

Database design 卡桑德拉-一张大桌子vs多张桌子

Database design 卡桑德拉-一张大桌子vs多张桌子,database-design,cassandra,datastax,Database Design,Cassandra,Datastax,我目前正在尝试卡桑德拉数据库。 我正在使用DataStax开发中心和DataStax C#驱动程序 我当前的模型非常简单,仅包括: ParameterId(int)-将用作表的id 值(bigint) 测量时间(时间戳) 我将有1000个(不多,不少)参数,从1到1000。每秒钟将获得一次每个参数的输入,并将运行数年 我的问题是,创建以下表格是否更好: CREATE TABLE keyspace.measurement ( parameterId int, value big

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

我当前的模型非常简单,仅包括:

  • ParameterId(int)-将用作表的id
  • 值(bigint)
  • 测量时间(时间戳)
我将有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进行范围查询?

我们这里有两种方法,每种方法都有各自的优缺点

方法1:为每个参数创建一个表(1000个表只包含 a值和测量时间)

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

方法2:创建一个大表

NoSql DB的设计目的是为了更好地处理更多记录。即使拥有10亿张唱片也会有很好的表现


考虑到这一点,
“每秒钟将获得一个参数条目,并将运行数年。”
,我觉得方法1最适合您的场景,前提是未来参数数量不会增加。

您将使用此方法获得非常广泛的行数。我建议您不要使用表格格式,我会选择一些允许您控制行宽度的内容

根据您的查询要求,我将为您写下一个更合适的模式(IMHO):

这与您的非常相似,但是它有一个主要优势:您可以配置行的宽度,并且没有任何热点。想法非常简单:
parameterId
granularity
字段都是分区键,因此它们告诉您的数据将去哪里,而
measureTime
将使您的数据保持有序。假设您希望逐日查询,您需要将
度量时间的
yyyy-mm-dd
值存储到
粒度中,将同一天的所有度量值分组在一起

这允许您使用有效的范围查询检索位于同一分区上的所有值(因此根据给定的
parameterId
granularity
字段对)。在逐日配置中,每个分区将有86400条记录。这个数字可能仍然很高(建议限制为10k IIRC),您可以通过使用
yyyy-mm-dd HH:00
值逐小时分组来降低tht值


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

虽然您的答案与一般nosql dbs的答案一样好,但问题是针对cassandra的。1000个表不适合cassandra(每个表的内存开销),您应该尽量保持在“数百”而不是“数千”的范围内。你不必和卡桑德拉切分。谢谢!这是一种魅力。我的阅读表演现在达到了顶峰!额外的查询很容易通过编程处理。
CREATE TABLE keyspace.measurement (
    parameterId int,
    granularity timestamp,
    value bigint,
    measureTime timestamp,
    PRIMARY KEY((parameterId, granularity), measureTime)
) WITH CLUSTERING ORDER BY (measureTime DESC)