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

2024-10-04 01:28:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为amazonalexa开发一项技能,并使用DynamoDB存储用户最喜欢的对象的信息。我希望数据库中有3列:

  1. Alexa用户名
  2. 对象
  3. 颜色

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

如果我为每个条目创建一个惟一的id,并且有多个用户,那么我不可能知道用来查询活动用户对象的id。在


Tags: 对象用户信息id数据库db颜色技能
3条回答

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

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

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

参见:Working with Queries

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

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

你有两个主要的选择,他们有不同的利弊

首先可以使用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,因此不能在其中存储大量数据。在

相关问题 更多 >