使用 GSI 插入 DynamoDB

问题描述 投票:0回答:1

DynamoDB 新手。

假设我正在构建一个采用单表设计的电子商务网站,其中有许多实体,例如订单、交货等。我从分区键和排序键开始,通用名称为:“PK”和“SK”,因为它使得当您还将交付实体存储到分区键中时,将分区键命名为“order_id”是没有意义的。

例如,如果我有一个具有以下属性的订单实体:

{"id": "O#123", "customer_id": "C#456", "order_name": "test", "order_date": "xx-xx-xx"}

如果我将订单 id 设置为 PK,客户 id 设置为 SK,并且还在 dynamoDB 中给它一个实体类型属性,那么它应该是这样的:

|  PK   |   SK   |  order_name  |  order_date  |  entity_type  | 
| O#123 | C#456  |   test       |  xx-xx-xx    |      order    | 

然后,我按照相同的模式构建 GSI-PK 和 GSI-SK,也具有通用名称,因为如果我当前的 PK 和 SK 无法满足查询需求,我会将不同的实体属性放入其中。

现在,基于Python中的插入语法,假设在上面的同一条记录中,我想使用entity_type作为GSI-PK,order_date作为GSI-SK,我应该如何插入?

我应该用这个插入吗?

dynamodb.put_item(
TableName='YourTableName',
Item={
    'pk': {'S': 'O#123'},
    'sk': {'S': 'C#456'},
    'order_name': {'S': 'test'},
    'GSI-SK': {'S': 'xx-xx-xx'},
    'GSI-PK': {'S': 'order'},
})

如果是这样,那么其他人读起来确实很混乱,因为他们不知道 GSI-PK 是“引用”旧的“entity_type”列。此外,其他实体需要具有“entity_type”属性,但并非所有记录都需要具有 GSI(GSI 是稀疏的)。那么如果我想查看这条记录属于哪个实体,为什么我应该寻找两个不同的属性(有些将其类型存储在 GSI-PK 中,有些存储在entity_type 中)?

或者我应该通过复制两个属性来像这样插入:

dynamodb.put_item(
TableName='YourTableName',
Item={
    'pk': {'S': 'O#123'},
    'sk': {'S': 'C#456'},
    'order_name': {'S': 'test'},
    'GSI-SK': {'S': 'xx-xx-xx'},
    'GSI-PK': {'S': 'order'},
    'order_date': {'S': 'xx-xx-xx'},
    'entity_type': {'S': 'order'},
})

如果是这样,我是否存储了大量重复的信息?如果我需要另一个 GSI 怎么办?我又复制了?

我的理解有问题吗?或者这就是“单表设计”的样子?

amazon-web-services amazon-dynamodb
1个回答
0
投票

您对单表设计的理解是正确的,是的,GSI 的重复属性在 DynamoDB 中很常见。

DynamoDB 要求您要在 GSI(全局二级索引)中查询的属性必须以 GSI-PK 和 GSI-SK 形式存在于项目中。这些索引与主表是分开的,因此需要显式添加数据,即使感觉像是重复。这是 DynamoDB 提供的高性能和灵活性的权衡。

关于您的两种情况

1 - 不重复:如果只添加 GSI-PK 和 GSI-SK 而不保留原始属性(entity_type 和 order_date),从技术上讲是可行的,但更难理解。除非有人很了解架构,否则不清楚 GSI-PK 指的是什么,这会使您的设计更难以维护。

2 - 有重复:包含原始属性(entity_type 和 order_date)及其副本(GSI-PK 和 GSI-SK)使模式更具可读性和一致性。您可能会担心浪费存储空间或其他问题,但 DynamoDB 专为这种重复而设计,因为它的成本可以忽略不计,并且有助于提高清晰度和查询。

如果您需要另一个 GSI,您只需复制该索引所需的属性即可。例如,如果您想按

delivery_status
进行索引,您可以添加如下内容:

'GSI2-PK': 'delivered',
'GSI2-SK': 'O#123'

这并不意味着复制所有属性,仅复制那些有助于您高效查询的属性。

© www.soinside.com 2019 - 2024. All rights reserved.