我是Cassandra数据库的初学者。我准备了事件存储表的示例,该示例如下所示:
CREATE TABLE IF NOT EXISTS eventstore.Event(
Id uuid,
Data text,
Version int,
AggregateId uuid,
EventIdentity uuid,
Date timestamp,
PRIMARY KEY (AggregateId, Version)
) WITH CLUSTERING ORDER BY (Version ASC)
其中:
Id->每个事件的唯一GUID
数据-> JSON事件数据
版本->事件版本的int值
AggregateId->命名,聚合ID
EventIdentity->事件类型的ID
日期->事件发生时的时间戳记
我不确定主键是否正确(AggregateId,Version)以及是否按版本进行聚类。我想知道我的表是否将被正确分区。由AggregateId进行分区,该分区包含此聚合的所有事件(按版本排序)。
按AggregateId划分的分区,其中包含此聚合按版本排序的所有事件。
如果这是您分区的目标,那么您已经正确配置了PRIMARY KEY。我唯一要添加的就是围绕此语句:
Id->每个事件的唯一GUID
如果您真的想确保唯一性(并且聚合事件可以共享版本,则可以在PRIMARY KEY定义的末尾添加您的ID:
PRIMARY KEY (AggregateId, Version, Id)
两个后续问题:
1)您期望的查询模式是什么?如果在AggregateId
子句中始终有Version
和/或WHERE
,那应该没问题。如果没有,您可能需要重新考虑PK定义。
2)AggregateId
:Version
的比率是多少?您需要确保分区不受无限增长的限制,并要注意Cassandra的20亿个每个分区的限制。
但是总的来说,您似乎在正确的轨道上。