Dynamo DB 概念
Dynamo DB 概念
我知道我将要被问到的一些问题可能很愚蠢,但我对Dynamo Db还很陌生,对它有很多困惑。
我的问题是:
1. 在阅读了这篇文章《什么是哈希和范围主键?》之后,我在思考是否可以创建一个不是主键的范围键。比如说我想定义一个表Orders {**Id**,Date,Name....}
,其中Id作为哈希键,Date作为范围键,但Date不是主键的一部分。
2. 在一个包含哈希键和范围键的表中,是否可以只使用哈希键或范围键进行查询?比如说在表orders {**ID,Date**,Address,Quantity....}
中,我将主键定义为哈希键为ID,范围键为Date。我们是否可以只使用ID或Date进行查询,而不是同时使用两者?
3. 在创建本地二级索引和全局二级索引时,什么是投影属性的概念?
Dynamo DB概念问题的出现原因是因为Range key在主键中的作用以及如何实现对Hash key的查询。解决方法是使用全局二级索引(GSI)来反转基表的模式。
Dynamo DB中,Range key是主键的一部分,可以是基表或索引(LSI,GSI)的模式的一部分,但它始终是主键的一部分,并且始终与Hash key一起存在。
创建表后,无法更改其模式。对于Hash + Range表,您只能对特定Hash key的Range key进行查询。因此,为了在给定特定Range key的情况下启用对Hash key的查询,需要在该表中创建一个GSI,该GSI基本上颠倒了基表的模式。GSI的Hash key将是基表的Range key,GSI的Range key将是基表的Hash key。然后,您可以使用与基表可以使用的相同的查询API在GSI上进行查询。例如,假设您有一个图书馆表,其Hash key是owner,Range key是BookISBN。您可以查询属于owner=Alex的所有书籍ISBN,或者查询一系列ISBN,但要找到属于Michelle的书籍ISBN,您必须进行不同的查询调用。现在,使用这个模式,要找到ISBN=123412341234的书的所有者是困难的。实际上,您必须扫描整个表来找到ISBN=123412341234的书的所有者。如果在图书馆表中添加了一个名为ISBNIndex的GSI,其Hash是ISBN,Range是owner,那么您可以使用ISBNIndex GSI上的查询调用来找到具有ISBN=123412341234的书的所有者。
投影属性允许您选择要在索引中包含的项目中的属性。索引可以通过使用备用模式来加快数据检索速度。基表的主键始终包含在索引投影中。如果选择KEYS_ONLY,索引中的项目将只包括基表和索引主键。如果选择INCLUDE,在索引中除了基表和索引主键之外,还将包括您在NonKeyAttributes中指定的属性。如果选择ALL,所有项目属性都将投影到索引中。
根据Dynamo DB文档,Query操作中需要Hash key条件(必须是EQ),而Range key条件(可以是任何可排序操作符)是可选的。