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