我有一个存储系统活动的表。数据模型具有以下结构
CREATE TABLE activities {
id UUID,
json text,
activity_date Date,
activity_time Timestamp,
activity_type Text,
Primary Key(activity_date, activity_type, activity_time)
}
上表提供的潜在用例是
查找为给定日期生成的事件
查找为给定日期和活动类型生成的事件
查找在给定时间范围内为给定日期和活动类型生成的事件。
上面的数据模型容易受到一个bug的攻击,如果在同一毫秒内插入两个具有相同活动类型的活动,其中一个活动可能会覆盖另一个活动。这是因为casssandra保证时间戳的唯一性高达一毫秒。
数据库中的另一个表具有类似的结构,我们看到两个记录相互覆盖。这在两年内已经发生了两次。虽然概率很低,但仍有可能搞乱数据的完整性。
为了克服这个问题,我们可以添加一个 IF NOT EXISTS
子句,这将导致一个insert失败,而如果出现这种情况,另一个insert将成功。
不过,我想知道,这里还有什么可以做的吗?
Cassandra还能提供什么我们没有的?
这是一个设计糟糕的数据模型吗?但是考虑到这些查询,我们没有更多的列可以添加到键中。
1条答案
按热度按时间z9ju0rcb1#
一般来说,如果你有可能冲突的时间戳-你可以去使用timeuuids而不是时间戳。它们应该是唯一的,你可以随时从它们那里得到时间戳。
https://docs.datastax.com/en/cql/3.3/cql/cql_reference/timeuuid_functions_r.html
其他注意事项:
你使用你定义的uuid吗?
您应该向分区键添加熵,可能((activity\u date,activity\u type),activity\u time),因为只有activity\u date作为分区键才会导致热点