【问题标题】:DynamoDB access to items inside a dictionaryDynamoDB 访问字典中的项目
【发布时间】:2021-08-02 13:10:01
【问题描述】:

我开始在 python 中使用 dynamoDB,但我怀疑我在网上找不到答案。我有一个这种格式的 JSON:

{
"version": "1.0.0",
"trips":[
       {
        "paymentMode": "ONLINE",
        "type":"A",
        "locations":{
            "name": "Zona A",
            "payment":1000
            "company": ["XXX", "YYY"]

        },
        
       {
        "paymentMode": "CASH",
        "type":"B",
        "locations":{
            "name": "Zona D",
            "payment":200
            "company": ["XXX", "YYY"]
        }
    ]
} 

我可以直接存储它,但我不知道是否有一种方法可以在 get_item 操作或类似操作中单独访问行程中的每个元素?例如,将 paymentMode 和 type 作为主键和排序键,即使它们位于“trips”字段内。

输入将是这样的 Json,但我想将这些字段作为 PK(考虑到它们是唯一的),所以我只能检索一个项目。

我知道您可以只扫描所有内容,然后迭代旅行,但也许有更多元素,这将花费太长时间。有没有办法直接做到这一点?如果是这样,我该怎么做? dynamoDb 会自动执行此操作,还是我必须将其命名为 trips.PaymentMode 或类似名称?

非常感谢

【问题讨论】:

  • 您需要了解使用 DynamoDB 进行数据建模。有许多在线资源可用,例如 AWS re:Invent 2020:使用 Amazon DynamoDB part 1 和 part 2 进行数据建模。
  • 是的,我需要了解更多有关它的信息,但我找不到是否不能选择作为分区键,即 JSON 文件中的某些内容(例如 paymentMode,考虑到它是唯一的)。输入将始终是 JSON,只是旅行内容和版本会改变
  • 回答您的直接问题:不,如果您打算将 trips 作为嵌入列表存储在您的 DynamoDB 项目中,那么您不能使用 trips 中的字段作为您的分区键或排序键。更广泛地说,尝试为您的表提出架构的问题在于,我们没有足够的信息来说明您的客户端应用程序打算如何访问这些数据(它们的查询模式是什么)。没有它,您将无法设计架构。
  • 设计是给我们这个文件,只有一个。唯一改变的是“trips”中的项目。然后,我会收到一个请求,根据请求的信息,我需要提取“trips”中一项的信息。
  • 信息不够。将有多少次旅行(大约)?如果有的话,是什么使一次旅行与另一次旅行有独特的区别?您需要支持什么样的查询(仅支付模式?仅类型?支付模式加类型?所有上述?其他?)一次旅行和另一次旅行之间是否有任何关系,或者它们是独立的?

标签: python amazon-dynamodb dynamodb-queries


【解决方案1】:

在设计如何在数据库中构建数据时,您需要考虑 A) 您要存储哪些数据 B) 您将如何访问您的数据。

此外,您需要考虑问题中数据库的特征。对于 DynamoDB,主要约束是您的主键。主键要么是分区键,要么是分区键和排序键的组合,并且对于所有项目必须是唯一的。

虽然不完全清楚,但根据您的 JSON,您的项目是带有字段 paymentMode、type 和 locations 的旅行。如果这些是您在项目上的字段,那么您的密钥应该是什么?您提到使用paymentMode 和type,但是,这些可能不合适,因为它们可能不是唯一的。如果您有与这些关联的时间,则主键 paymentMode_type 和排序键时间可能会为您完成这项工作,但这取决于数据量。

最好为每个项目分配一个唯一标识符(例如uuid),并在要用于查询的字段上添加二级索引(paymentMode、type)。这将使您无需扫描整个数据库即可高效查询。但请记住,二级索引会产生额外费用。

【讨论】:

  • 我的主要疑问是,如果我使用密钥(支付模式+时间)创建数据库,即使它们在“trips”字段内,它们是否会正确存储?如果是这样,我应该如何定义它,比如trips.paymentMode或直接paymentMode?​​span>
  • 您是说数据库中的每个项目都有一个行程数组吗?
  • 不。仅此一份文件。具有可变长度的旅行项目
  • 那么trips 字段中的项目就是您在DynamoDB 中的项目。您不应该尝试将单个项目与子文档数组一起存储
  • 好的。键应该是 3 个字段的组合,我应该创建一个键属性并附加我需要检索它的所有数据吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
相关资源
最近更新 更多