Amazon dynamodb DynamoDB中查找表的设计

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.

我在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.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 |          |
  • 给定T.Id(值为'tid'),给我所有具有A(值为'A')的U对象
    从Id=T.tid&Lookup.beginsWith('A.A')的表中选择“Lookup”
    然后我们可以通过使用“:”分割查找的值来获得所有的U的id。然后使用批处理获取所有U的值
  • B和C的想法相同
  • 最后给出U.Id(值为'uid'),给我一个T.Id,它的列表中有U.Id。
    从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 |          |
    
  • 给定T.Id(值为'tid'),给我所有具有A(值为'A')的U对象
    从Id=T.tid&Lookup.beginsWith('A.A')的表中选择“Lookup”
    然后我们可以通过使用“:”分割查找的值来获得所有的U的id。然后使用批处理获取所有U的值
  • B和C的想法相同
  • 最后给出U.Id(值为'uid'),给我一个T.Id,它的列表中有U.Id。
    从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:

    分部