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

Luc*_*asN 3 python amazon-web-services amazon-dynamodb alexa-skills-kit

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

  1. Alexa userId
  2. 宾语
  3. 颜色

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

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

Iva*_*tyk 7

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

首先,您可以使用复合主键.它允许您在表中具有1对N的关系.

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

AlexaId - 分区键

对象 - 排序键

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

此方法的局限性:

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

  • 以这种方式处理多个项目不是原子的.DynamoDB本身不支持事务,因此在处理项目时不能具有原子性.您可以将DynamoDB事务库用于Java,但DynamoDB中的事务非常昂贵.

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

您可以在此处阅读有关DynamoDB数据类型的更多信息.

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

AlexaId - 分区键

对象 - 列表或集合或地图

这种方法的优点:

  • DynamoDB本身支持每个项目的原子性.您可以执行项目的原子更新,甚至可以进行乐观锁定

此方法的局限性:

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


Joh*_*ein 1

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

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

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

请参阅:使用查询