【问题标题】:Secondary indexes for Dynamodb flexibilityDynamodb 灵活性的二级索引
【发布时间】:2018-04-03 08:43:18
【问题描述】:

来自 SQL 背景,试图理解 NoSQL 尤其是 DynamoDB 选项。鉴于此架构:

{
    "publist": [{
            "Author": "John Scalzi",
            "Title": "Old Man's War",
            "Publisher": "Tor Books",
            "Tags": [
                "DeepSpace",
                "SciFi"
            ]
        },
        {
            "Author": "Ursula Le Guin",
            "Title": "Wizard of Earthsea",
            "Publisher": "Mifflin Harcourt",
            "Tags": [
                "MustRead",
                "Fantasy"
            ]
        },
        {
            "Author": "Cory Doctorow",
            "Title": "Little Brother",
            "Publisher": "Doherty"
        }
    ]
}

我可以让主表将作者/标题作为哈希/范围键。全局二级索引可以是 Publisher/Title。这里的最佳做法是什么。如何在没有全表扫描的情况下获取发布者的所有作者列表?不能有二级索引,因为 Publisher/Author 不是唯一的!如果我想要所有带有 DeepSpace 标签的标题,我还有什么选择?

编辑:请参阅下面的 RPM 和 Vikdor 答案。 GSI 不必是唯一的,因此 Publisher/Author 是可能的。但问题仍然存在:是否有任何解决方法可以通过标签获取所有作者,而不需要全表扫描?

【问题讨论】:

    标签: amazon-web-services nosql amazon-dynamodb


    【解决方案1】:

    不能有二级索引,因为 Publisher/Author 不是唯一的!

    当然可以,只需确保您的 Publisher/Title 索引将 Author 作为投影 - 然后您可以按发布者进行查询,然后迭代结果并收集作者。

    设置索引时,您可以选择将哪些属性投影到索引中。拥有 Publisher 或 Publisher/Title 键并不意味着您只能查看 Publisher 或 Publisher 和 Title,这意味着您只能按 Publisher 或 Title 查询,所以如果您拥有所有属性或作者属性投影到您的索引中,您可以使用查询而不是全表扫描来按出版商获取作者列表。

    【讨论】:

    • 感谢 RPM。解决了第一个问题!
    【解决方案2】:

    不能有二级索引,因为 Publisher/Author 不是唯一的!

    (散列主键,范围主键)元组不必是唯一的,用于定义全局二级索引。这只是表级键定义的要求,即表不能有多行具有相同值的(散列主键,范围主键)元组。

    如何在不进行全表扫描的情况下获得出版商的所有作者列表

    您在 Publisher (Hash PK)、Author (Range PK) 上定义 GSI,并在 GSI 上使用 DynamoDB 查询,并将 Publisher 属性设置为 Hash Key Value。

    与 SQL 中可以根据检索模式在任意列上创建非聚集索引不同,在 DynamoDB 中,由于每个表的本地二级索引和全局二级索引的数量是有限的,因此列出以下内容很重要在识别表的哈希主键和范围主键之前检索数据的用例并尽可能利用本地二级索引,因为它们使用表的读写能力并且是强一致的(您可以选择最终运行- LSI 上的一致性查询也可以节省容量)。 GSI 需要自己的读写能力,并且是最终一致的。

    【讨论】:

    • 谢谢维克多。这很有帮助。
    【解决方案3】:

    很遗憾,DynamoDB 目前不支持此功能。 DDB 不提供查询嵌套文档(如 MongoDB)的能力。

    在这种情况下,请考虑对数据进行不同的建模并将嵌套文档放在单独的表中。

    希望这会有所帮助。

    干杯,

    【讨论】:

    • 感谢 Ess 的回复。对于如何以不同方式对数据进行建模以达到我想要的结果,您有什么建议吗?
    • 看起来您想查询标签,在这种情况下,您需要将表建模得更像 SQL,您需要为标签维护单独的表。我知道这不是我们期望 NoSQL 工作的方式,但是 DDB 有局限性
    猜你喜欢
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多