Amazon dynamodb DynamoDB中查找表的设计
我在dynamodb中设计查找表时遇到了一些问题,而没有遇到GSI的问题 我有一个对象U,这个对象有4个属性(这是有趣的)。Id、A、B和C。我有另一个对象T,它有2个(感兴趣的)属性Id和一个U.Id列表 我需要创建一个DynamoDB表,在这里我可以快速查找,例如 给定T.Id,给我所有具有A的U对象,或给定T.Id,给我所有具有B的连接U对象。最后给定U.Id,给我在列表中具有U.Id的T.Id 我在想什么Amazon dynamodb DynamoDB中查找表的设计,amazon-dynamodb,Amazon Dynamodb,我在dynamodb中设计查找表时遇到了一些问题,而没有遇到GSI的问题 我有一个对象U,这个对象有4个属性(这是有趣的)。Id、A、B和C。我有另一个对象T,它有2个(感兴趣的)属性Id和一个U.Id列表 我需要创建一个DynamoDB表,在这里我可以快速查找,例如 给定T.Id,给我所有具有A的U对象,或给定T.Id,给我所有具有B的连接U对象。最后给定U.Id,给我在列表中具有U.Id的T.Id 我在想什么 | T.Id | Sort Key | U.Id | U.A | U.B | U.
| T.Id | Sort Key | U.Id | U.A | U.B | U.C |
| T1 | U1 | U1 | abc | rew | bgt |
| T1 | U2 | U2 | bgf | red | bcs |
| T2 | U3 | U3 | abc | rew | bgt |
其中T.Id是主键,排序键是U.Id。
然后是U.ID、U.a、U.B和U.C.上的GSI
这种方法现在应该可以使用,但我只限于5个GSI,我知道稍后会添加更多U属性。
T的名单上可能有多达2000个U.Id
我应该如何进行DynamoDB设计,以获得最快速的查找,并且不会遇到GSI限制的问题
像get all U.Id给定T.Id、U.A和U.B这样的用例很好地支持,但这不是一个要求,我可以要求此表的用户进行多个调用的交叉。我的解决方案的想法是花费空间复杂性来降低时间复杂性 创建一个表,散列键应该是U.id或T.id,前缀为“U.”或“T.”,然后将范围键称为查找。查找列应为合成键,如果要将T.Id的查找设置为U.Id,则查找键的前缀为“Id”。如果查找是将T.Id设置为a,则查找键的前缀为“a”。后缀为U.Id,与B和C相同。
属性A、B、C只应存储在id和查找均为U.id值的记录中 为了允许U.Id引用回T.Id,您应该为查找列创建一个GSI
|Id |Lookup |Attributes|
+----+-----------+----------+
|U.Id|U.Id |A,B,C |
|T.Id|id.value | |
|T.Id|A.value:Id | |
|T.Id|B.value:Id | |
|T.Id|C.value:Id | |
从Id=T.tid&Lookup.beginsWith('A.A')的表中选择“Lookup”代码>
然后我们可以通过使用“:”分割查找的值来获得所有的U的id。然后使用批处理获取所有U的值
从Lookup=Id.uid的表中选择“Id”代码>
那你就有T.Id了
注意:我编写的SQL只是伪代码,仅为您提供一个想法。我的解决方案的想法是花费空间复杂性来降低时间复杂性 创建一个表,散列键应该是U.id或T.id,前缀为“U.”或“T.”,然后将范围键称为查找。查找列应为合成键,如果要将T.Id的查找设置为U.Id,则查找键的前缀为“Id”。如果查找是将T.Id设置为a,则查找键的前缀为“a”。后缀为U.Id,与B和C相同。
属性A、B、C只应存储在id和查找均为U.id值的记录中 为了允许U.Id引用回T.Id,您应该为查找列创建一个GSI
|Id |Lookup |Attributes|
+----+-----------+----------+
|U.Id|U.Id |A,B,C |
|T.Id|id.value | |
|T.Id|A.value:Id | |
|T.Id|B.value:Id | |
|T.Id|C.value:Id | |
从Id=T.tid&Lookup.beginsWith('A.A')的表中选择“Lookup”代码>
然后我们可以通过使用“:”分割查找的值来获得所有的U的id。然后使用批处理获取所有U的值
从Lookup=Id.uid的表中选择“Id”代码>
那你就有T.Id了
注意:我编写的SQL只是伪代码,仅为您提供一个想法。您所描述的是一对多关系。了解如何在NOSQL存储中建立一对多关系模型 为了减少抽象性,我假设u=user,t=team。一个团队可以有许多用户。一个用户只能在一个团队中 对此建模的方法是有两个表—一个用户表和一个团队表。注意,如果团队没有属性,那么只有用户表就足够了 用户表: Partiton键:UserId 属性:A 属性:B 属性:C 属性:TeamId 用户表GSI: 分区键:团队Id 团队表: 分区键:TeamId 属性:X 给定T.Id,给我所有具有 使用GSI查询用户表,分区键=TeamId,在 给定T.Id,给我所有连接的具有B的U对象 使用GSI查询用户表,分区键=TeamId,在B上使用filterexpression 最后给我U.Id,给我T.Id,它的列表中有U.Id。 使用主分区键在用户表上使用GetItem @Yu Huang描述的解决方案是一个图节点实现。您可以在DynamoDB的上下文中阅读
我不推荐这种实现。它适用于多对多关系,并将在不需要的情况下增加大量复杂性。您所描述的是一对多关系。了解如何在NOSQL存储中建立一对多关系模型 为了减少抽象性,我假设u=user,t=team。一个团队可以有许多用户。一个用户只能在一个团队中 对此建模的方法是有两个表—一个用户表和一个团队表。注意,如果团队没有属性,那么只有用户表就足够了 用户表: Partiton键:UserId 属性:A 属性:B 属性:C 属性:TeamId 用户表GSI: 分部