我有一个存储系统活动的表。数据模型具有以下结构
CREATE TABLE activities {
id UUID,
json text,
activity_date Date,
activity_time Timestamp,
activity_type Text,
Primary Key(activity_date, activity_type, activity_time)
}
上表将服务的潜在用例是
上面的数据模型容易受到如下错误的影响:如果在同一毫秒内插入两个具有相同活动类型的活动,则其中一个可以覆盖另一个活动。这是因为casssandra可以保证时间戳唯一性高达毫秒。
数据库中的另一张表具有类似的结构,我们看到记录相互覆盖两次。这在2年内发生了2次。尽管概率很低,但是仍然有可能破坏数据完整性。
为了克服这个问题,我们可能会在插入查询中添加一个IF NOT EXISTS
子句,这将导致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作为分区键会导致热点