Amazon dynamodb DynamoDB二级索引不是唯一的?

Amazon dynamodb DynamoDB二级索引不是唯一的?,amazon-dynamodb,amazon-dynamodb-index,Amazon Dynamodb,Amazon Dynamodb Index,我已经设置了一个只有分区键(没有排序键)的二级索引,但是我发现实际上我可以用同一个分区键插入多个项 如果我使用二级索引中的分区键发出查询,我将获得分区键等于给定分区键值的所有项 我是DynamoDB的初学者,我想知道是否只使用分区键设置二级索引,但是使用相同的分区键插入多个项是一个好主意 我使用的是Amplify.js,并具有以下GraphQL模式: type UserMeta @model @key(fields: ["owner"]) @auth(rules: [

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

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

我是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
关联的分区键(没有排序键)。但是我可以正常查询
UserMeta
careers

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

我应该为
byOwner
索引设置排序键吗?排序键可能是
id

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

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

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

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

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

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

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

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

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


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

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

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

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

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

type Query {
    career(owner: String!, id: Id!)
}
。。。那么添加ID作为排序键是值得的。这意味着
Career
的GraphQL解析器每次都能准确地检索到正确的对象

但是,如果您需要查询以获得
Career
对象列表

type Query {
    careers(owner: String!, since: dateString)
}
。。。默认情况下,您只希望检索类似“最近创建的职业”的内容,那么在创建职业时创建另一个属性跟踪会更好——比如
createdAt:String--并将其用作排序键。然后,解析器将按逻辑顺序接收该所有者的职业列表,允许它只读取最早(或最新)的职业


关于如何在AWS AppSync中使用GSI键和排序键。

RDBMS和DynamoDB之间的一个区别是后者希望您了解数据访问模式,并使用它来通知数据应该采取何种形式。所以这个问题

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

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

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

type Query {
    career(owner: String!, id: Id!)
}
。。。那么添加ID作为排序键是值得的。这意味着
Career
的GraphQL解析器每次都能准确地检索到正确的对象

但是,如果您需要查询以获得
Career
对象列表

type Query {
    careers(owner: String!, since: dateString)
}
。。。默认情况下,您只希望检索类似“最近创建的职业”的内容,那么在创建职业时创建另一个属性跟踪会更好——比如
createdAt:String--并将其用作排序键。然后,解析器将按逻辑顺序接收该所有者的职业列表,允许它只读取最早(或最新)的职业


关于如何在AWS AppSync中使用GSI和排序键。

谢谢,非常有用的提示!!谢谢,非常有用的提示!!