use*_*127 4 amazon-web-services amazon-dynamodb
我无法理解全局二级索引和表之间的区别。
我会尝试一下。
一件事是您可以获得最终一致的数据视图,它也可以充当一种“事务”模型。
想象一下,您要跟踪用户/组关系。这可能不是最好的例子,但我认为它可以说明几点。
假设您的用例是您希望能够将Query所有组分配给一个用户,并将Query所有用户分配给一个组。在这个简单的设置中,您会想到有 2 个表:
UsersToGroups哈希+范围为userId+groupIdGroupsToUsers哈希+范围为groupId+ userId。如果您需要更新客户需要的任何关系:
UsersToGroups表(哈希:userId,范围:groupId)GroupsToUsers表(哈希:groupId,范围:userId)如果您的第二次写入失败会怎样?如果第二次失败,你如何回滚第一次写入?你怎么知道你的第二次写入失败了,比如连接失败?
这些问题处理起来并不有趣。
使用 GSI,您可以拥有一个表,具体取决于您希望如何管理它。如果不是使用 2 个表,假设我使用一个表和一个 GSI。
UsersToGroups具有userId+`groupId哈希值+范围的表GroupsToUsers散列+范围为groupId+ 的GSI userId。如果您需要更新客户需要的任何关系:
UsersToGroups这就对了。您只需提出 1 个请求。如果写入成功,您可以保证您的索引(最终)具有相同的数据。根据您查询此索引的频率或需要传播的数据量,您可以相应地调整吞吐量。
这个简单的例子假设userIds 和groupId是唯一的,并且当它们被投影到索引时不会发生冲突,但我认为它至少可以很好地解释一些有用性
有关更多信息,请参阅全球二级索引指南文档。
让我们把你的问题分成几部分。
1.全局二级索引和表有什么区别。
表:在 dynamo db 中,表只是数据的存储设施,与 RDBMS 不同,它不必维护任何类型的约束以及与其他表的关系。
GSI:它是 dynamo db 提供的一项功能,有助于以更快的方式从表中检索数据。
2. 为什么我要使用全局二级索引,为什么不直接创建另一个表。
由于 dynamo db 是一个 NoSql db,我们无法像使用 Oracle 等传统 RDBMS 那样进行查询。为了达到查询的目的,我们需要对要查询的表的那些属性建立索引。如果我们不创建 GSI 或 LSI 索引,并且想要提取一些信息,则必须扫描整个表。
如果我们创建另一个表,那么我们也需要在某个时间点查询该表。
3. 当使用 gsi 对表进行写入时,我必须同时写入表和索引。
虽然我不确定,但我们可以放心地假设数据不会以原始格式单独写入表和索引。他们一定在数据库内做了某种优化。因此,与普通数据库写入相比,所涉及的成本并不完全相同。
另外,我们开发人员不需要同时写入 GSI 和表,它由 dynamo db 本身管理,我们只需要写入表即可。
4. 使用 gsi 有什么好处?
a) 与 LSI 不同,GSI 使索引与表保持松散耦合。我们可以在需要时单独创建/删除它们。所以它比LSI更好
b) 由于它提供了哈希和范围组合,因此可以以更优化的方式完成查询。
c) 与表的完整扫描(在没有索引的情况下不可避免)相比,它更快且成本更低。
希望能帮助到你 :)
| 归档时间: |
|
| 查看次数: |
1531 次 |
| 最近记录: |