0

我正在开发亚马逊Alexa的技能,我正在使用DynamoDB来存储有关用户最喜欢的对象的信息。我想3列在数据库:如何在同一主键下创建多个DynamoDB条目?

  1. Alexa的用户id
  2. 对象
  3. 颜色

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

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

回答

0

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

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

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

参见:Working with Queries

+0

海报正确地询问是否能够查询“获取活动用户的对象”。 –

1

DynamoDB是一个的NoSQL状,文件数据库,或键值存储;这意味着,您可能需要考虑与RDBMS不同的表。根据我对你的问题的理解,对于每个用户,你想在对象的列表上存储关于他们的偏好的信息;因此,请保持主键简单,即用户标识。然后,有一个单独的“列”,您可以存储所有的偏好。这可以是元组列表(对象,颜色)或唯一的{object:color}字典。

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

1

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

首先,你可以使用一个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的限制,所以你不能大量的数据存储在其中。
0

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