如何在同一主键下创建多个DynamoDB条目?

时间:2017-07-21 01:26:16

标签: python amazon-web-services amazon-dynamodb alexa-skills-kit

我正在为亚马逊Alexa开发一项技能,我正在使用DynamoDB来存储有关用户最喜欢的对象的信息。我想在数据库中有3列:

  1. Alexa userId
  2. 对象
  3. 颜色
  4. 我目前将Alexa userId作为主键。我遇到的问题是,如果我尝试使用相同的userId向数据库添加条目,它将覆盖已存在的条目。如何允许用户通过拥有多行来在db中将多个对象与它们相关联?我希望能够通过userId查询数据库并接收他们指定的所有对象。

    如果我为每个条目创建一个唯一的ID,并且有多个用户,我就不可能知道要查询的ID来获取活动用户的对象。

4 个答案:

答案 0 :(得分:7)

这里有两个主要选项,它们有不同的优点和缺点

首先,您可以使用composite primary key。它允许您拥有1-to-N relationships in your table

在你的情况下,它可能是这样的:

AlexaId - 分区键

对象 - 排序键

它允许您获取给定 AlexaId 的所有对象。

此方法的局限性:

  • 您可以使用相同的分区键存储最多10GB的数据,这意味着同一AlexaId的所有项目的大小总和限制为10GB。

  • 以这种方式处理多个项目非原子。 DynamoDB本身不支持事务,因此在处理项目时不能具有原子性。您可以使用DynamoDB transactions library for Java,但交易为quite expensive in DynamoDB

另一种选择是将这些对象存储在项目本身中。在常规SQL数据库中,您只能在DynamoDB的行中存储标量值,每个项目都可以包含复杂类型,例如集合,列表和嵌套对象。

您可以阅读有关DynamoDB数据类型here的更多信息。

有了这个你可以有这样一个表:

AlexaId - 分区键

对象 - 列表或集合或地图

此方法的优点:

  • DynamoDB本身支持每个项目的原子性。您可以执行项目的原子更新,甚至可以optimistic locking

此方法的局限性:

  • 项目大小限制为400KB,因此您无法在其中存储大量数据。

答案 1 :(得分:1)

DynamoDB是一个类似NoSQL的文档数据库或键值存储;这意味着,您可能需要以不同于RDBMS的方式考虑您的表。根据我的理解,对于每个用户,您希望在对象的列表上存储有关其首选项的信息;因此,请保持主键简单,即用户ID。然后,有一个单一的"列"存储所有首选项的位置。这可以是元组(对象,颜色)的列表,也可以是唯一的{object:color}字典。

当您浏览Web UI中的项目时,它会将这些复杂的数据结构显示为类似json的文档,您可以随意扩展它们。

答案 2 :(得分:0)

如果Alexa ID + Object的组合是唯一的(非重复的),那么您应该使用复合主键配置您的表格:

  • 分区键= Alexa ID
  • 排序键=对象

然后,您可以有效地检索给定的Alexa ID + Object的行,该行将被完全编入索引。

请参阅:Working with Queries

答案 3 :(得分:0)

您无法使用相同的主键创建多个条目。请创建复合键(多个键一起作为主键)。请注意,您不能拥有相同组合的多个记录