【问题标题】:Getting database entry when performing delete operation in Cassandra在 Cassandra 中执行删除操作时获取数据库条目
【发布时间】: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


【解决方案1】:

DELETE 返回数据的基本答案是,这确实不是 Cassandra 可以做的事情。 Cassandra 中的删除实际上是对墓碑的写入。 Cassandra 通常不会在写入之前进行读取,并且需要这实际上被认为是一种反模式。

要记住的另一件事是 Cassandra 中的删除意味着数据不会离开系统,直到您为该表设置 GC Grace 设置之后的某个时间。

这些请求是否始终是基于时间的?如果是,您可以考虑对请求进行分桶。所以你会有一个类似的表:

Requests{
  UserId text,
  TimeBucket text,
  RequestId int,
  RequestData text,
  Active boolean,
  PRIMARY KEY((UserId, TimeBucket) RequestId)
}

时间段可以是每小时或每分钟,这对您的用例有意义。然后,您可以使用不同的选择来处理给定的存储桶。这将使您不会对给定的分区键有太多请求。假设时间桶足够大,可以覆盖大多数活动请求,因此您最终不需要查看所有桶。

我也不确定您打算将记录保留多长时间,如果它们被保存很长时间或永远,这种分桶将确保您最终不会得到可能最终在 InActive 中发生的过大分区表与其他设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    相关资源
    最近更新 更多