有没有比使用两个全局二级索引 (GSI) 更好的方法来模拟这种访问模式?
Is there a better way to model this access pattern than to use two global secondary indexes (GSI)?
-
amazon-web-services
-
amazon-dynamodb
-
dynamodb-queries
-
amazon-dynamodb-index
-
amazon-dynamodb-data-modeling
我正在尝试找出一个应用程序的数据模型和访问模式,该应用程序跟踪不同领域(牧场)之间的动物活动。有这样的移动记录:
PK FROM TO DATE
------------------------------------------------------
ANIMAL#001 FIELD#A FIELD#B January 3
ANIMAL#001 FIELD#Q FIELD#R September 19
ANIMAL#002 FIELD#A FIELD#B January 3
ANIMAL#003 FIELD#C FIELD#D March 15
ANIMAL#005 FIELD#F FIELD#A April 22
对于特定领域,例如 FIELD#A
,我想知道所有进出该领域的运动,运动的日期,以及动物的数量。结果应如下所示:
DATE FROM TO NUMBER_ANIMALS
--------------------------------------------------
January 3 FIELD#A FIELD#B 2
April 22 FIELD#F FIELD#A 1
可能的解决方案和尝试:
具有 PK=FROM, SK=TO
的 GSI。如果我用 PK=FIELD#A
查询 GSI,这只会给出图片的一半,即 from FIELD#A
的运动。我无法获得到FIELD#A
.
的动作
像 FIELD#A#FIELD#B
这样的复合属性用作 GSI 中的 PK
。遇到与尝试 1 相同的问题。
两个 GSI。 GSI1 有 PK=FROM
,GSI2 有 PK=TO
。我可以使用 PK=FIELD#A
查询 GSI1 并进行一些 post 处理 (groupby, count
) 以获得部分结果。然后我可以使用 PK=FIELD#A
和 post-process 查询 GSI2,得到其余的结果。这看起来可行,但需要两个 GSI 和两个查询。我不能超载一个 GSI,因为使用的两列都来自同一项目。
扫描整个 table 和过滤我宁愿避免的结果的某种组合,因为整个 table.[=24 中可能有 50,000 多个项目=]
我知道如何使用两个 GSI 来完成,但最有效的方法是什么?
我可以想象一个稍微不同的 table 结构(ANIMALID
是分区键,FIELDID
是排序键):
ANIMALID | FIELDID | FROM_TO | ...
——————————————————————————————————
ANIMAL#1 | FIELD#A | FROM | ...
ANIMAL#1 | FIELD#B | TO | ...
ANIMAL#2 | FIELD#C | FROM | ...
ANIMAL#2 | FIELD#A | TO | ...
以及具有以下结构的 GSI:
FIELDID | ANIMALID | ...
然后您可以通过FIELDID
查询GSI并聚合结果。
amazon-web-services
amazon-dynamodb
dynamodb-queries
amazon-dynamodb-index
amazon-dynamodb-data-modeling
我正在尝试找出一个应用程序的数据模型和访问模式,该应用程序跟踪不同领域(牧场)之间的动物活动。有这样的移动记录:
PK FROM TO DATE
------------------------------------------------------
ANIMAL#001 FIELD#A FIELD#B January 3
ANIMAL#001 FIELD#Q FIELD#R September 19
ANIMAL#002 FIELD#A FIELD#B January 3
ANIMAL#003 FIELD#C FIELD#D March 15
ANIMAL#005 FIELD#F FIELD#A April 22
对于特定领域,例如 FIELD#A
,我想知道所有进出该领域的运动,运动的日期,以及动物的数量。结果应如下所示:
DATE FROM TO NUMBER_ANIMALS
--------------------------------------------------
January 3 FIELD#A FIELD#B 2
April 22 FIELD#F FIELD#A 1
可能的解决方案和尝试:
具有
的动作PK=FROM, SK=TO
的 GSI。如果我用PK=FIELD#A
查询 GSI,这只会给出图片的一半,即 fromFIELD#A
的运动。我无法获得到FIELD#A
.像
FIELD#A#FIELD#B
这样的复合属性用作 GSI 中的PK
。遇到与尝试 1 相同的问题。两个 GSI。 GSI1 有
PK=FROM
,GSI2 有PK=TO
。我可以使用PK=FIELD#A
查询 GSI1 并进行一些 post 处理 (groupby, count
) 以获得部分结果。然后我可以使用PK=FIELD#A
和 post-process 查询 GSI2,得到其余的结果。这看起来可行,但需要两个 GSI 和两个查询。我不能超载一个 GSI,因为使用的两列都来自同一项目。扫描整个 table 和过滤我宁愿避免的结果的某种组合,因为整个 table.[=24 中可能有 50,000 多个项目=]
我知道如何使用两个 GSI 来完成,但最有效的方法是什么?
我可以想象一个稍微不同的 table 结构(ANIMALID
是分区键,FIELDID
是排序键):
ANIMALID | FIELDID | FROM_TO | ...
——————————————————————————————————
ANIMAL#1 | FIELD#A | FROM | ...
ANIMAL#1 | FIELD#B | TO | ...
ANIMAL#2 | FIELD#C | FROM | ...
ANIMAL#2 | FIELD#A | TO | ...
以及具有以下结构的 GSI:
FIELDID | ANIMALID | ...
然后您可以通过FIELDID
查询GSI并聚合结果。