【问题标题】:How do you UPDATE a Cassandra column without directly knowing the primary key?如何在不直接知道主键的情况下更新 Cassandra 列?
【发布时间】:2019-06-21 16:52:01
【问题描述】:

假设您有一个User 表,id 作为主键。 您有一个名为email 的列和一个名为name 的列。

你想UPDATEUser.name基于User.email

我意识到UPDATE 命令需要您传入主键。这是否意味着我不能使用纯CQL 迁移,并且需要先查询User.id 主键才能使用UPDATE

在这种情况下,我确实知道 PRIMARY KEY,因为 devprod 的 UUID 相同,但感觉很脏。

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    是的,您是正确的 - 您需要知道记录的主键才能对数据执行更新或删除特定记录。这里有几个选项,具体取决于您的数据模型:

    1. 使用有效令牌范围扫描对表执行完整扫描(查看this answer 了解更多详细信息);
    2. 如果经常需要这样做,您可以创建一个物化视图,使用User.email 作为分区键,并获取您可以更新的所有消息 ID(但您需要从您的应用程序中执行此操作,没有CQL 中的嵌套查询支持)。但也请注意,物化视图是 Cassandra 中的“实验性”功能,可能并非一直有效(它在 DataStax Enterprise 中更稳定)。此外,如果您有一些用户拥有数十万封电子邮件,这可能会创建大分区。
    3. 通过使用附加表格,在您的代码中为第二项点赞

    【讨论】:

    • 我认为值得注意的是,(2)也可以实现,无需使用实验功能,只需将所需数据写入不同的表映射emailid
    • 是的 - 但这是代码中的附加逻辑。但我已经更新了答案 - 谢谢
    • 这个答案是正确的(顺便说一下,第四种可能性可能是使用二级索引而不是物化视图),但是您需要注意:“id”是您的关键,所以它是唯一的(每条记录都有唯一的 id)。但 user.email 可能不是唯一的:如果您搜索特定的 user.email,您可能会获得 2 条(或 20,000 条)同一封电子邮件的不同记录。你想把所有这些用户的名字都改成同一个名字吗?还是别的什么?
    • 这需要更多的“商业”知识:-)
    【解决方案2】:

    我认为Alex's answer 涵盖了您的问题——“我怎样才能在 PK 列中找到与非 PK 列的值相反的值?”。

    但是,我认为值得注意的是,提出这个问题表明您应该重新考虑您的数据模型。 C* 数据模型设计中的一条经验法则是,您首先要考虑您需要的查询,而您已经错过了UPDATE 查询用例。您现在可以在不更改模型的情况下使事情正常进行,但如果您发现需要进行其他没有准备好的查询,您将遇到大量索引和/或 MV 的操作问题。

    更一般地,搜索有关 Cassandra 数据建模的文章和其他资源。听起来您基本上是在将 C* 用于关系用例,所以您需要研究一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 2013-01-27
      • 2023-03-04
      • 1970-01-01
      • 2013-07-26
      • 2018-12-11
      相关资源
      最近更新 更多