DynamoDB 二级索引不唯一?

DynamoDB secondary index is not unique?

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

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

我是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 table 有一个二级索引 byOwner,其分区键与 owner(无排序键)关联。但我可以正常查询 UserMetacareers

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

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

with a traditional RDBMS, the index column can not be the same, I don't know why this is possible in DynamoDB, is this a best practice in DynamoDB??

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

DDB 中唯一可用的是 table 的主键。

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

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

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

Should I set a sort key for the byOwner index? maybe the sort key can be the id column?

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

如果您要使用一次只加载一个的 GraphQL 查询,例如...

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

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

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

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

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

关于如何将 GSI 和排序键用于 AWS AppSync。