【问题标题】:database primary key dynamoDB or other数据库主键 dynamoDB 或其他
【发布时间】:2019-08-08 10:08:59
【问题描述】:

我将 DynamoDB 用于我的 Alexa 技能。在 dynamoDB 的文档中,它说主键(和任何二级索引)必须是以下三种类型之一:二进制、字符串、数字。我想知道是否有一种方法可以使用数组或“标签”之类的东西来搜索数据库,以尝试将数据库中的项目与用于搜索项目的最匹配的“标签”进行匹配。如果 dynamoDB 无法做到这一点,是否还有其他数据库允许此功能?否则,我可以使用什么样的服务(除了数据库)来允许我进行这种查询?

【问题讨论】:

    标签: node.js database amazon-dynamodb alexa querying


    【解决方案1】:

    使用 DynamoDB,您可以通过将主键组成

    来实现此目的
    • 分区键(每个项目的一些唯一 ID),以及
    • 排序键(特定标签)

    这会导致存储重复数据,因为您需要存储每个标签的项目数据才能允许每个键的快速查询。

    结构应该是这样的

    Partition (ID) | Sort (Tag) | other attributes
    1234           | node.js    | { timestamp: "...", message: "...", ... }
    1234           | database   | { timestamp: "...", message: "...", ... }
    1234           | alexa      | { timestamp: "...", message: "...", ... }
    

    请注意,每个项目的分区键 (ID) 相同,但排序键 (Tag) 会发生变化。其他属性可以是您喜欢的任何属性,但在这种情况下它是重复的。其他项目将以类似的方式添加,它们的唯一 id 作为分区键,标签作为排序键,每个项目一个。

    此模型确实针对快速读取进行了优化。从项目中删除标签时,您将相应地删除该项目。

    但是随后item中的一些数据发生了变化,例如message属性,你需要更改每个item,导致多次写入。此外,写入不会是原子的,导致某些数据可能过时。

    当然,这完全取决于您的应用程序需要哪些其他数据查询以及您将拥有的读取与写入量,这是否是有效的方法。

    【讨论】:

    • 感谢您的回答。所以问题是排序键也仅限于字符串、二进制和数字。让我试着更清楚地了解我在问什么。假设我在数据库中有一个项目,我想用多个字符串标记它,以便以后可以搜索它(我想使用这些标签作为键)。所以假设我有一个代表一首歌的项目,我想用“我喜欢它”、“最喜欢的”、“摇滚”来标记。等等...同时,每首歌曲都有不同数量的此类标签,因此我无法创建“预定义”列来为每个项目对这些标签进行分类。
    • 所以现在说我有一堆标签,我想在数据库中搜索具有最多“匹配”标签的项目。我该怎么做?
    • 所以你需要能够通过只给出标签来获取项目。 AFAIK 在此您必须将标签作为分区键。您可以在 Dynamo 中为每个表设置多个索引,以支持您的查询。但是话又说回来,这会导致(甚至更多?)重复。不幸的是,我不能给你直接的解决方案。阅读this detailed answer on Dynamo DB mappings 并点击外部资源的链接。您还可以考虑,也许 DynamoDB 也不是最适合这项工作的,也许关系数据库会更好。祝你好运!
    【解决方案2】:

    DynamoDB 专为快速读/写和大规模扩展而设计。使用 dynamoDB 的最佳方式是转储记录数据系统,然后使用某个 id 访问整个对象。 为了提高速度,已经做出了一些妥协。其中之一是复杂的查询。对于您的用例,我认为ElasticSearch 是最佳选择。

    【讨论】:

    • 感谢您的回答。那么如果我使用 ElasticSearch,那么这些标签将如何在数据库中使用呢?我的意思是不是主键仍然必须是以下之一:字符串、二进制、数字?
    猜你喜欢
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2012-05-29
    • 2012-02-10
    • 2010-10-15
    相关资源
    最近更新 更多