【问题标题】:How to achieve one to many relation in dynamodb?如何在 dynamodb 中实现一对多关系?
【发布时间】:2021-12-11 03:35:51
【问题描述】:

我是 dynamodb 的新手,但使用 MongoDB 关系。在阅读 dynamodb 一对多关系的 aws 文档时,我很困惑。

所以我的情况是:

例如,我有表用户和地址:

Table: User
----
username
fname
lname
address: ref to addresses

Table: Addresses
----------
address line 1
address line 2
city
Zip
state
country

你能帮我如何在 dynamodb 中实现这一点吗?

  1. 如何存储关系数据?
  2. 在单个查询中检索包括关系在内的数据?

【问题讨论】:

    标签: node.js amazon-web-services aws-lambda amazon-dynamodb aws-mobilehub


    【解决方案1】:

    DynamoDB 不是关系数据库。您无法执行您正在考虑的关系请求类型(特别是在您的问题 #2 中描述的单个查询中)。它需要以不同的方式思考您将如何存储和访问您的数据,因此它可能不适合您的应用程序。

    Dynamo 不提供外键或表连接。每个表都有一个分区键 (PK),或分区键和排序键 (SK) 的组合。当一个表只有一个 PK 时,只能查询单个项。当它同时有PK和SK时,可以通过PK/SK查询单个item,也可以查询所有共享同一个PK的item。

    您所描述的实现 1 对 N 数据的一种方法如下所示:

    Table: Users
    ------------
    [PK] userId
    username
    fname
    lname
    
    Table: Addresses
    ----------------
    [PK] userId
    [SK] addressId
    address line 1
    address line 2
    city
    zip
    state
    country
    

    在此布局中,您仍需要两次调用 Dynamo 来获取用户的所有信息,包括地址。您将通过该 userId 对 Users 表进行一次 getItem 调用,并通过同一 userId 对 Addresses 进行查询调用。第一次调用将返回单个用户记录,第二次调用将返回按 addressId 排序的地址记录列表。

    您必须手动管理您的数据。由于没有外键,因此也没有约束或级联。如果您不小心,很容易得到孤立的数据。同样,Dynamo 可能不是最适合您的应用程序的工具。

    我在这里所描述的只是表面。对于希望使用 DynamoDB 构建企业软件进行数据存储的任何人来说,了解其架构方法和最佳实践至关重要。来自 SQL 甚至 MongoDB 的背景,你的直觉可能会让你误入歧途,导致你构建的东西性能不佳并且难以调试。对于正确的工作类型,它是一个非常强大的工具,但您必须先进行尽职调查才能了解它。

    --

    编辑补充:我上面描述的方法甚至不是一个好方法! AWS 共享了文档并讨论了这类事情,包括他们的Best Practices for DynamoDB,这远远超出了这个答案的范围。

    【讨论】:

      【解决方案2】:

      使用 DynamoDB,它要求您对如何构建和访问数据有不同的心态。它要求您提前考虑如何查询数据。它当然不如关系数据库灵活,但它为您提供的是可扩展性,前提是您可以正确构建数据。

      1. 如何存储关系数据?

      这是实现这一目标的一种方法(单表设计)。

      pk sk data
      user111 address|mumbai|1 mumbai 1, india
      user111 address|mumbai|2 mumbai 2, india
      user111 address|delhi|1 delhi 1, india
      user222 address|chennai|1 chennai 1, india
      • 使用用户 ID 作为分区键(“pk”)。
      • 使用用户地址作为排序键(“sk”)。
      • 用户地址位于“数据”字段中。随意拥有任意数量的字段。
      1. 在单个查询中检索包括关系在内的数据?

      这是一个使用适用于 javascript 的 AWS 开发工具包的示例。

      const docClient = new AWS.DynamoDB.DocumentClient()
      
      const params = {
        TableName: 'users',
        KeyConditionExpression: '#pk = :userId and begins_with(#sk, :data)',
        ExpressionAttributeNames: {
          "#pk": "pk",
          "#sk": "sk"
        },
        ExpressionAttributeValues: {
          ":userId": "user111",
          ":data": "address|"
        }
      }
      
      // get addresses
      const res = await docClient.query(params).promise()
      

      这里的想法是使用“begins_with”来检索用户地址。这就是您在 DynamoDB 中为一对多关系建模的方式。

      更多信息: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-sort-keys.html

      【讨论】:

        猜你喜欢
        • 2015-02-06
        • 1970-01-01
        • 1970-01-01
        • 2019-08-04
        • 1970-01-01
        • 2015-11-19
        • 1970-01-01
        • 2012-04-05
        • 1970-01-01
        相关资源
        最近更新 更多