我有一个存储系统活动的表。数据模型具有以下结构
CREATE TABLE activities {
id UUID,
json text,
activity_date Date,
activity_time Timestamp,
activity_type Text,
Primary Key(activity_date, activity_type, activity_time)
}
上表所服务的潜在用例是
上述数据模型容易受到以下错误的影响:如果在同一毫秒内插入具有相同活动类型的2个活动,则其中一个活动可以覆盖另一个。那是因为casssandra保证时间戳的唯一性高达一毫秒。
数据库中的另一个表具有类似的结构,我们看到记录相互覆盖两次。这在2年内发生了2次。虽然,概率很低,但仍有可能弄乱数据完整性。
为了克服这个问题,我们可能会在插入查询中添加一个IF NOT EXISTS
子句,这会导致1个插入失败而另一个插入失败,如果出现这种情况。
但是,我想知道还有什么可以在这里完成的吗?
还有cassandra能提供的其他东西我们都错过了吗?
这是一个设计糟糕的数据模型的情况吗?但鉴于查询,我们没有任何列添加到键。
通常,如果您有可能存在冲突的时间戳 - 您可以使用timeuuids而不是时间戳。它们应该是唯一的,您可以随时从它们中取回时间戳。
https://docs.datastax.com/en/cql/3.3/cql/cql_reference/timeuuid_functions_r.html
其他一些说明: