如何在不直接知道主键的情况下更新Cassandra列?

如何在不直接知道主键的情况下更新Cassandra列?,cassandra,Cassandra,给定一个场景,其中有一个用户表,id作为主键。 您有一个名为email的列和一个名为name的列 您想根据User.email更新User.name 我意识到UPDATE命令需要您传入一个主键。这是否意味着我不能使用纯CQL迁移,需要先查询User.id主键,然后才能更新 在本例中,我确实知道主键,因为对于dev和prod,uuid是相同的,但感觉不干净 是的,您是正确的-您需要知道记录的主键才能对数据执行更新或删除特定记录。根据您的数据模型,这里有几个选项: 使用有效令牌范围扫描对表执行完全扫

给定一个场景,其中有一个用户表,id作为主键。 您有一个名为email的列和一个名为name的列

您想根据User.email更新User.name

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


在本例中,我确实知道主键,因为对于dev和prod,uuid是相同的,但感觉不干净

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

使用有效令牌范围扫描对表执行完全扫描,查看更多详细信息; 如果经常需要这样做,您可以创建一个物化视图,将User.email作为分区键,并获取所有可以更新的消息ID,但您需要从应用程序中执行此操作,因为CQL中不支持嵌套查询。但也要注意,物化视图在Cassandra中是实验性的特性,可能不会一直工作,在DataStax企业中更稳定。此外,如果您有一些用户有成千上万封电子邮件,这可能会创建大分区。 通过使用附加表,使用您的代码执行第二项
是的,您是正确的-您需要知道记录的主键才能对数据执行更新或删除特定记录。根据您的数据模型,这里有几个选项:

使用有效令牌范围扫描对表执行完全扫描,查看更多详细信息; 如果经常需要这样做,您可以创建一个物化视图,将User.email作为分区键,并获取所有可以更新的消息ID,但您需要从应用程序中执行此操作,因为CQL中不支持嵌套查询。但也要注意,物化视图在Cassandra中是实验性的特性,可能不会一直工作,在DataStax企业中更稳定。此外,如果您有一些用户有成千上万封电子邮件,这可能会创建大分区。 通过使用附加表,使用您的代码执行第二项 我认为这涵盖了您的问题-如何在PK列中从非PK列的值向后查找值


然而,我认为值得注意的是,提出这个问题表明您应该重新考虑您的数据模型。C*数据模型设计中的一条经验法则是,首先要考虑所需的查询,而忽略了更新查询用例。目前,您可能可以在不更改模型的情况下完成工作,但如果您发现需要进行其他未做好准备的查询,您将遇到大量索引和/或MVs的操作问题

一般来说,搜索有关Cassandra数据建模的文章和其他资源。听起来你基本上是在用C*作为一个关系用例,所以你想研究一下。

我想这涵盖了你的问题-我如何在PK列中找到一个从非PK列的值向后工作的值


然而,我认为值得注意的是,提出这个问题表明您应该重新考虑您的数据模型。C*数据模型设计中的一条经验法则是,首先要考虑所需的查询,而忽略了更新查询用例。目前,您可能可以在不更改模型的情况下完成工作,但如果您发现需要进行其他未做好准备的查询,您将遇到大量索引和/或MVs的操作问题


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

我认为值得注意的是,2也可以实现,不需要使用实验性的特性,只需将所需的数据写入一个不同的表,将email映射到id即可。是的,但这是代码中的附加逻辑。但是我更新了答案-谢谢你这个答案是正确的,顺便说一句,第四种可能是使用二级索引而不是物化视图,但是您需要注意:id是您的密钥,所以它是唯一的。每个记录都有一个唯一的id。但是user.email可能不是唯一的:如果您搜索特定的user.email,同一封电子邮件可能会收到2或20000条不同的记录。是否要将所有这些用户名更改为同一名称?或者其他什么?这需要更多的商业知识:-我认为值得注意的是,2也可以通过简单地将所需的数据写入不同的表(将电子邮件映射到id)来实现,而无需使用实验功能。是的-但这是代码中的附加逻辑。但是我更新了答案-谢谢你这个答案是正确的,顺便说一下,第四种可能是使用二级索引而不是物化视图,但是有一些
g您注意:id是您的密钥,因此它是唯一的。每个记录都有一个唯一的id。但是user.email可能不是唯一的:如果您搜索特定的user.email,您可能会在同一封电子邮件中获得2或20000条不同的记录。是否要将所有这些用户名更改为同一名称?还是别的?这需要更多的商业知识:-