0

我设置了一个只有分区键(没有排序键)的二级索引,但我发现实际上我可以插入多个具有相同分区键的项目。

如果我使用二级索引中的分区键发出查询,我将获得分区键等于给定分区键值的所有项目。

我是 DynamoDB 的初学者,我想知道是否设置只有一个分区键的二级索引,但是插入多个具有相同分区键的项目是个好主意。

我正在使用 Amplify.js 并拥有这个 GraphQL 架构:

type UserMeta @model @key(fields: ["owner"]) @auth(rules: [
    { allow: owner, operations: [create, delete, update] },
    {
        allow: groups,
        groups: ["Admins"],
        operations: [update, delete]
    }
]) {
    familyName: String
    givenName: String
    facebookUrl: AWSURL
    twitterUrl: AWSURL
    description: String
    careers: [Career] @connection(keyName: "byOwner", fields: ["owner"])
    owner: String!
}

type Career @model @key(name: "byOwner", fields: ["owner"]) @auth(rules: [
    { allow: owner, operations: [create, delete, update] },
    {
        allow: groups,
        groups: ["Admins"],
        operations: [update, delete]
    }
]) {
    id: ID!
    company: String
    companyUrl: AWSURL
    industry: String
    occupation: String
    owner: String!
}

如您所见,该Career表有一个二级索引byOwner,其分区键关联owner(无排序键)。但我可以正常查询careersUserMeta

与传统的RDBMS,索引列不能相同,我不知道为什么在DynamoDB中这是可能的,这是DynamoDB中的最佳实践吗?

byOwner我应该为索引设置排序键吗?也许排序键可以是id列?

4

2 回答 2

2

与传统的RDBMS,索引列不能相同,我不知道为什么在DynamoDB中这是可能的,这是DynamoDB中的最佳实践吗?

我使用过的每个 RDBMS 都允许唯一和非唯一索引。

DDB 中唯一可用的唯一性是表的主键。

具有相同分区键的记录很常见。在表中,具有相同分区键的记录必须具有不同的排序键。

对于索引,允许重复,这是非常常见的用例。

于 2020-12-04T14:27:49.853 回答
1

RDBMS 和 DynamoDB 之间的一个区别是后者希望您了解您的数据访问模式并使用它来告知数据应该采用什么形状。所以这个问题...

我应该为 byOwner 索引设置排序键吗?也许排序键可以是 id 列?

...只能通过了解您计划如何加载Career对象来回答。

如果你打算使用一次只加载一个的 GraphQL 查询,比如......

type Query {
    career(owner: String!, id: Id!)
}

...然后将 ID 添加为排序键是非常值得的。这意味着 a 的 GraphQL 解析器Career每次都能够准确地检索到正确的对象。

但是,如果您需要获取Career对象列表的查询...

type Query {
    careers(owner: String!, since: dateString)
}

...默认情况下,您只想检索“最近创建的职业”之类的内容,然后通过在创建职业时创建另一个属性跟踪来更好地为您服务 - 比如说createdAt: String!- 并将其用作排序键。然后,解析器将按逻辑顺序接收该所有者的职业列表,使其仅读取最旧(或最新)的职业。

此答案包含有关如何将 GSI 和排序键与 AWS AppSync 一起使用的一些相关信息。

于 2020-12-04T22:20:24.523 回答