是否有比使用两个全局二级索引 (GSI) 更好的方法来模拟此访问模式?



我正在尝试找出跟踪不同领域(牧场(之间动物运动的应用程序的数据模型和访问模式。有如下所示的移动记录:

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

可能的解决方案和尝试:

  1. 一个 GSI 与PK=FROM, SK=TO.如果我用PK=FIELD#A查询 GSI,这只给出了图片的一半,即来自FIELD#A的运动。我无法获得FIELD#A的动作

  2. 复合属性(如FIELD#A#FIELD#B(用作 GSI 中的PK。遇到与尝试 1 相同的问题。

  3. 两个GSI。GSI1 有PK=FROM,GSI2 有PK=TO。我可以用PK=FIELD#A查询GSI1并进行一些后处理(groupby, count(以获得部分结果。然后,我可以使用PK=FIELD#A和后处理查询 GSI2,获取结果的其余部分。这看起来可以工作,但需要两个 GSI 和两个查询。我不能重载一个 GSI,因为正在使用的两列都来自同一个项目。

  4. 扫描整个表和过滤结果的某种组合,我宁愿避免,因为整个表中可能有 50,000+ 个项目。

我可以看到如何使用两个 GSI 来做到这一点,但最有效的方法是什么?

我可以想象一个稍微不同的表结构(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 并汇总结果。

相关内容

最新更新