如何在dynamodb中实现一对多的关系?

时间:2018-03-13 12:07:42

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

我是dynamodb的新手但是与MongoDB的关系工作。我在阅读aws docs for dynamodb一对多关系时非常困惑。

所以我的情景是:

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

import os 
filename = 'C:\Python\Scripts\data.txt' 

if percentage_value[0] <= percentage_value[1]:
    fileout = open(filename, 'w')
else:
    if os.path.exists(filename): os.remove(filename)

你能帮我解决一下如何在dynamodb中实现这个目标。

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

1 个答案:

答案 0 :(得分:2)

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

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

如您所述,实现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,这远远超出了这个答案的范围。