当前位置: 首页 > 知识库问答 >
问题:

如果主表中的属性用作GSI中的键,Amazon DynamoDB GSI是否会删除GSI行?

赵骏奇
2023-03-14

假设我在DynamoDB中有一个表,如果我的GSI的键基于一个属性,但是我删除或更改了该属性,那么GSI表的行为是什么?它会删除并更改GSI表中的键吗?

TableName:哺乳动物表格分区键:哺乳动物名称属性1:哺乳动物数量腿属性1:哺乳动物大小

GSI名称哺乳类动物数legssi分区键:哺乳类动物数legs排序键:哺乳类大小

现在假设我有类似于哺乳动物表的数据:

哺乳动物名称:人,哺乳动物腿数:2,哺乳动物大小:5,哺乳动物名称:狗,哺乳动物腿数:4,哺乳动物大小:1

这意味着我的GSI表现在有

哺乳动物数腿:2,哺乳动物大小:5,哺乳动物数腿:4,哺乳动物大小:1

如果我把人类的哺乳动物大小改为2,这是否意味着我的GSIs中会有这个?

哺乳动物数腿:2,哺乳动物大小:2,哺乳动物数腿:4,哺乳动物大小:1

还是加在最上面

MammalNumberOfLegs: 2, MammalSize: 5
MammalNumberOfLegs: 2, MammalSize: 2
MammalNumberOfLegs: 4, MammalSize: 1

我认为这个问题也可以表述为,GSI的映射是否与原始表在一行的基础上完全1-1,或者是否有任何GSI会增加一行而不是删除/修改现有行的情况?

共有1个答案

盖和泰
2023-03-14

DynamoDB使用最终一致的模型异步更新全局二级索引。这意味着,即使主表上的数据已更新,它也不会立即反映在GSI中。然而,对GSI的更新是一个两步过程,将有一个写入操作来删除以前的项目,另一个操作来写入新项目。所以最后我们会

哺乳动物数腿:2,哺乳动物大小:2,哺乳动物数腿:4,哺乳动物大小:1

 类似资料:
  • 正如这个问题中所述,我假设您不能把更新日期之类的东西作为表的排序键,因为如果您更新,您将创建一个重复的记录。 此外,我总是假设同样的事情也适用于使用更新日期的GSI。但在我的场景中,我将更新日期作为GSI上的排序键,并且在更新原始项时不会创建新记录。 综上所述,属性和关键模式包括: 属性: Id MySortKey MyComputerdField 更新日期 表格: 分区键:Id 排序键:MySo

  • 我从AWS文档中引用以下内容 具有相同分区键值的项按排序键排序的顺序存储。如果排序键数据类型为Number,则结果按数字顺序存储。对于String类型,结果按ASCII字符代码值的顺序存储。对于Binary类型,DynamoDB将二进制数据的每个字节视为无符号。 假设一个表有一个全局二级索引(没有相关的范围键),相同GSI值的数据将以什么顺序存储? 我这样问是因为我在GSI上使用lastEvalu

  • 我正在使用AWS控制台和NodeJS。 我有一个带有分区键(user\u id)和排序键(company\u id)以及其他属性的dynamodb用户表。 我的一个属性是用户的电子邮件。电子邮件是唯一属性。 我需要通过电子邮件user_id,但我没有他的user_id和company_id。 我认为我应该使用全球二级指数。 我点击了用户表,打开索引选项卡并为该表创建了GSI。(名称:电子邮件,类型

  • 我有两个不同的表,每个表有20k个条目,我错误地在同一个表中将summaryId作为主键和外键,但现在我想删除主键约束,它也是自动增量的。当我尝试drop primary key语法时,它返回一个错误: #1025-重命名'.\tg#sql-a38_7f'到'.\tg\rest_web_availability_summary_pm'时出错(errno: 150) 我尝试了以下查询。 如果有人有任

  • 我有一个带有哈希键(id)的表(配置文件),我有一个关于名称的GSI,一个关于国家的范围键。我想创建一个DAO方法,它将获取所有具有给定值的name和country的记录,如下所示:List getProfileWithNameAndCountry(name,country);

  • 我在Dynamodb有一张这样的桌子 我想列出表中的所有数据,但不想对表执行扫描。所以我在表上添加了一个索引。它的值将始终相同(示例中的) 现在我可以使用查询表中的所有数据。它的好处是所有数据都将驻留在Dynamodb的GSI中的同一个分区中。我想知道这样做是否是个好主意?还是会导致GSI上的热分区?