使用日期和时间戳记作为分区键和聚类键

时间:2019-02-17 23:49:00

标签: cassandra datastax

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

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. 查找在给定日期和活动类型下生成的事件
  3. 查找在给定时间范围内针对给定日期和activity_type生成的事件。

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

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

为了克服这个问题,我们可能会在插入查询中添加一个IF NOT EXISTS子句,这将导致1次插入失败,而另一次插入将成功。

但是,我想了解一下这里还有什么可以做的吗?

卡桑德拉还能提供的其他东西我们都缺少了吗?

是否存在设计不良的数据模型的情况?但是鉴于查询,我们没有更多的列可添加到键中。

1 个答案:

答案 0 :(得分:3)

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

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

其他一些注意事项:

  • 您是否使用定义的UUID?

  • 您应该在分区键中添加熵,也许是((activity_date,activity_type),activity_time),因为只有将activity_date作为分区键会导致热点