【发布时间】:2017-03-10 14:44:46
【问题描述】:
我有一个维护“请求”状态的网络服务。可能的状态是“Active”和“InActive”。我将请求信息存储在 Cassandra DB 中。我有两个表 - 一个用于活动请求,另一个用于非活动请求。它们都具有相同的架构。
我的架构如下:
ActiveRequests{
UserId text,
RequestId int,
RequestData text
PRIMARY KEY(UserId, RequestId)
}
我需要实现一个 API,它将请求从 Active 状态移动到 InActive 状态。我计划通过从 Active 表中删除条目然后将删除的条目添加到 InActive 表来执行此操作。
在 Cassandra 中,DELETE 操作似乎实际上并未返回已删除的数据。所以,我必须在请求条目上做一个SELECT(这样我就可以得到所有的请求数据来添加到InActive表中),然后做一个DELETE操作。有一个更好的方法吗?
编辑
您可能会问为什么我将 Active 和 InActive 请求作为单独的表进行维护。我可以将它们组合成一个表并有一个IsActive 列。我维护单独表的理由如下:
我希望对活动表的查询非常快。如果我想查询一个表中的所有 Active 请求,该表中同时包含 Active 和 InActive 请求,这些请求都不是最佳的。 partitionKey 是 userId,我希望 InActive 表对于给定的 UserId 有几个 1000 个 requestId。但是,Active 的每个 UserId 应该只有 10 个或更多 requestId。
【问题讨论】:
-
何必有两张桌子?如果您使用单个表,这将成为翻转标志的问题,在 CQL 中使用简单的
。但这是一个有趣的问题。 -
我希望对活动表的查询非常快。如果我想查询一个表中的所有 Active 请求,该表同时包含 Active 和 InActive 请求,这些请求不是最佳的。 partitionKey 是 userId,我希望 InActive 表对于给定的 UserId 有几个 1000 个 requestId。但是,Active 每个 UserId 应该只有 10 个或更多 requestId。
标签: java cassandra database-schema