使用日期和时间戳作为分区键和群集键

问题描述 投票:1回答:1

我有一个存储系统活动的表。数据模型具有以下结构

CREATE TABLE activities {
  id UUID,
  json text,
  activity_date Date,
  activity_time Timestamp,
  activity_type Text,
  Primary Key(activity_date, activity_type, activity_time)
}

上表所服务的潜在用例是

  1. 查找为给定日期生成的事件
  2. 查找为给定日期和activity_type生成的事件
  3. 查找在给定时间范围内为给定日期和activity_type生成的事件。

上述数据模型容易受到以下错误的影响:如果在同一毫秒内插入具有相同活动类型的2个活动,则其中一个活动可以覆盖另一个。那是因为casssandra保证时间戳的唯一性高达一毫秒。

数据库中的另一个表具有类似的结构,我们看到记录相互覆盖两次。这在2年内发生了2次。虽然,概率很低,但仍有可能弄乱数据完整性。

为了克服这个问题,我们可能会在插入查询中添加一个IF NOT EXISTS子句,这会导致1个插入失败而另一个插入失败,如果出现这种情况。

但是,我想知道还有什么可以在这里完成的吗?

还有cassandra能提供的其他东西我们都错过了吗?

这是一个设计糟糕的数据模型的情况吗?但鉴于查询,我们没有任何列添加到键。

cassandra datastax
1个回答
3
投票

通常,如果您有可能存在冲突的时间戳 - 您可以使用timeuuids而不是时间戳。它们应该是唯一的,您可以随时从它们中取回时间戳。

https://docs.datastax.com/en/cql/3.3/cql/cql_reference/timeuuid_functions_r.html

其他一些说明:

  • 你使用你定义的UUID吗?
  • 你应该把熵添加到你的分区键,也许((activity_date,activity_type),activity_time),因为只有activity_date作为分区键才会导致热点
© www.soinside.com 2019 - 2024. All rights reserved.