我正在使用DynamoDB来实现我的Alexa技能。在dynamoDB的文档中,它说主键(和任何二级索引)必须是三种类型之一:binary,string,number。我想知道是否有办法使用数组搜索数据库,或者像“标签”这样的东西来尝试匹配数据库中的项目以及用于搜索项目的最匹配的“标签”。如果DynamoDB无法做到这一点,是否还有其他允许此功能的数据库?否则,我可以使用什么样的服务(除了数据库),这将允许我进行这种查询?
DynamoDB专为快速读/写和大规模扩展而设计。使用dynamoDB的最佳方法是转储记录数据系统,然后使用一些id访问整个对象。已经做出一些妥协以提供速度。其中之一是复杂的查询。对于您的用例,我认为ElasticSearch是最佳选择。
使用DynamoDB,您可以通过使用主键来实现此目的
这会导致存储重复数据,因为您需要存储每个标记的项目数据,以便允许每个键快速查询。
结构将是这样的
Partition (ID) | Sort (Tag) | other attributes
1234 | node.js | { timestamp: "...", message: "...", ... }
1234 | database | { timestamp: "...", message: "...", ... }
1234 | alexa | { timestamp: "...", message: "...", ... }
请注意,每个项目的分区键(ID)都相同,但排序键(Tag)会发生变化。其他属性可以是您喜欢的任何属性,但在这种情况下它是重复的。其他项目将以类似的方式添加,其唯一ID作为分区键,标签作为排序键,每个项目一个。
该模型真正针对快速读取进行了优化。从项目中删除标记时,您将相应地删除该项目。
但是项目中的一些数据是更改,例如消息属性,您需要更改每个项目,从而导致多次写入。此外,写入不是原子的,导致某些数据可能过时。
当然,这完全取决于您的应用程序需要的其他数据查询以及您将拥有的读取与写入量,无论这是否是有效的方法。