我的 DynamoDB 结构如下。
我只创建了一张 DynamoDB 表,因为所有 aws dynamodb 文档都表明如果可能的话仅使用一张表是最佳解决方案。所以我最终得到以下结果:

在此表中,ID 是分区键,EntryType 是排序键。每项索赔和付款都有其所有者。我的访问模式如下:
我可以通过两个全局二级索引来实现这些。我可以使用 GSI(以 EntryType 作为分区键、以 CreationDate 作为排序键)列出按创建日期排序的患者、索赔和付款。此外,我还可以使用另一个具有 EntryType 分区键和 OwnerID 排序键的 GSI 来列出患者的索赔和付款。
我的问题是这种方法只能对创建日期进行排序。我的患者和索赔有更多的属性(每个属性大约 25 个),我还需要根据每个属性对它们进行排序。但 Amazon DynamoDB 有一个限制,即每个表最多可以有 20 个 GSI。因此,我尝试动态创建 GSI(根据请求动态创建),但效率也非常低,因为它将项目复制到另一个分区来创建 GSI(据我所知)。那么,按患者姓名、按索赔说明以及他们拥有的任何其他字段对患者进行排序的最佳解决方案是什么?
我们有一个 Dynamodb 表,Events其中包含大约 5000 万条记录,如下所示:
{
"id": "1yp3Or0KrPUBIC",
"event_time": 1632934672534,
"attr1" : 1,
"attr2" : 2,
"attr3" : 3,
...
"attrN" : N,
}
Run Code Online (Sandbox Code Playgroud)
有Partition Key=id并且没有Sort Key。id除了(全局唯一)和 之外,可以有数量可变的属性event_time,这是必需的。
此设置非常适合获取,id但现在我们希望有效地查询event_time并提取在该范围内匹配的记录的所有属性(可能是一百万或两个项目)。例如,标准将等于WHERE event_date between 1632934671000 and 1632934672000。
在不更改任何现有数据或通过外部过程转换数据的情况下,是否可以使用event_date和投影允许范围查询的所有属性来创建全局二级索引?根据我对 DynamoDB 的理解,这是不可能的,但也许还有我忽略的另一种配置。
提前致谢。
使用如下所示的 PartiQL 查询时:
SELECT * FROM my_table WHERE my_field IN [1, 2, 3...]
我收到此错误,我在 Google 中找不到该错误,并且没有告诉我有关如何解决该问题的任何信息:
DynamoDbException: Too many decomposed read operations for a given query
我需要做哪些不同的事情?
我有一个 DDB 表,其中哈希键作为 id(字符串),排序键作为标志(布尔值)。我想获取表中标志值为 true 的所有项目。我尚未设置任何 GSI 或 LSI,但如果需要,我可以创建它们。
模式
{
"id": {
"S": "<Some ID>"
},
"flag": {
"B": "<true/false>"
}
}
Run Code Online (Sandbox Code Playgroud) 我创建了一个表 TEST,它有 4 列:
column1:范围键
column2:排序键
第 3 列:GSI
第4列:普通属性
现在我想根据 GSI 值更新 column4 的值。我尝试使用以下代码,但仅当我同时传递范围和排序键时才有效。在我更新时的用例中,我只有 GSI 的值而不是范围/排序键。
Map<String, AttributeValue> key = new HashMap<>();
key.put(“column1”, new AttributeValue().withS(column1Value));
key.put(“column2”, new AttributeValue().withS(column2Value));
Map<String, AttributeValue> attributeValues = new HashMap<>();
attributeValues.put(“column4”, new AttributeValue().withS(column4Value));
attributeValues.put(“column3”, new AttributeValue().withS(column3Value));
UpdateItemRequest updateItemRequest = new UpdateItemRequest()
.withTableName(emailsTableName)
.withKey(key)
.withUpdateExpression(“set column4 = :column4”)
.withConditionExpression(“column3 = :column3”)
.withExpressionAttributeValues(attributeValues);
UpdateItemResult updateItemResult = dynamoDBClient.updateItem(updateItemRequest);
Run Code Online (Sandbox Code Playgroud)
这是否可以仅基于 GSI 更新 Dynamo DB 的列?
java amazon-web-services amazon-dynamodb amazon-dynamodb-index
我们遵循 AWS DynamoDB 的单表架构,并使用单个表来存储所有实体。
我们有在我们这里注册车辆的用户,表结构如下:
| 用户身份 | 实体ID | 实体类型 |
|---|---|---|
| 1 | 1 | 车 |
| 1 | 2 | 自行车 |
和关键属性:
partition_key=user_idsort_key=entity_id现在,我们需要仅获取汽车、自行车或任何其他车辆,user_id我想为其添加本地二级索引,并使用现有分区键(以实体类型作为排序键)。
在应用此更改时,它正在尝试重新创建表。
由于现有表中已有数据,有什么方法可以避免重新创建表吗?
amazon-web-services amazon-dynamodb terraform amazon-dynamodb-index