Database design 基于多值类型的DynamoDB二级索引

Database design 基于多值类型的DynamoDB二级索引,database-design,amazon-dynamodb,nosql,Database Design,Amazon Dynamodb,Nosql,我有一个表,它有一个数字类型的散列键和一个多值数字集属性 假设散列键是一个组id,多值集是该组的一组成员(用户ids) 我希望能够查询用户X在哪些组? 我知道我可以很容易地做到这一点,方法是对数据进行反规范化,并将用户id表存储到组id集合中 在我这样做之前,我想确保没有办法在multi-value属性上放置一个辅助全局索引,这样我就可以使用一个表并仍然获得良好的性能。给定一个HashKey=group_id和RangeKey=user_id的基表模式,您可以使用相反的模式添加一个GSI。GSI

我有一个表,它有一个数字类型的散列键和一个多值数字集属性

假设散列键是一个
组id
,多值集是该组的一组成员(
用户id
s)

我希望能够查询
用户X在哪些组?

我知道我可以很容易地做到这一点,方法是对数据进行反规范化,并将
用户id
表存储到
组id
集合中


在我这样做之前,我想确保没有办法在multi-value属性上放置一个辅助全局索引,这样我就可以使用一个表并仍然获得良好的性能。

给定一个HashKey=group_id和RangeKey=user_id的基表模式,您可以使用相反的模式添加一个GSI。GSI的HashKey将是user\u id,RangeKey将是group\u id。此GSI将回答以下问题:“用户X在哪些组?”。您不需要创建第二个表并对其进行维护。事实上,DynamoDB将自动将更改从基表传播到GSI,因此您不必担心索引是否保持最新。

您只能为标量类型属性创建GSI。
数字
字符串
二进制
布尔

从:

每个索引键属性必须是标量数据类型,而不是多值 设置可以将任何数据类型的属性投影到全局 二级指标;这包括标量数据类型和多值数据类型 设置。有关数据类型的完整列表,请参阅


但这对多值字段有效吗?我不想为组中的每个用户保留单独的记录。我希望每个组有一条记录,多值字段包含所有用户。这样,“谁在这个组中?”的查询只需要一次读取操作。如果我存储每个组->用户对,我可能只为了获得一个组的成员资格而查看数千次读取。虽然此GSI可能使用多个项来表示您的数据,但您不需要执行与组、用户对数量相等的GetItem调用。相反,您可以对组执行一系列操作,获得高达1MB的项目,并在几个查询中对数千对进行分页。最后,查询API按顺序读取,因此您只需消耗容量,就好像查询读取的所有项都是一个项一样。所以,若查询返回100个256字节的项,您将不会产生100个RCU,您将产生25kb/(4kb/RCU)=7个RCU。这是非常有见地的。虽然迈克严格地回答了我的问题,但你已经指出了解决我潜在问题的更好方法。