如何构建DynamoDB索引以允许通过多个字段进行检索



我是DynamoDB的新手,试图弄清楚如何构建我的数据/表/索引。我的模式包括一个itemid(唯一的)和一个orderid(每个订单有多个项目),以及其他一些任意属性。我希望能够通过其itemid检索单个项目,但也可以通过其OrderId检索一组项目。

我最初的直觉是将itemid设置为主键,将orderid设置为排序键,但这不允许我仅通过orderid进行查询。然而,如果我把它们倒过来,也会出现同样的问题。

示例数据:

tbody> <<tr>
ItemId OrderId
abc - 1231234
def - 3451234
ghi - 6785678
. jkl - 9015678

如果你的问题真的是你是否"能够";要做到这一点,那么使用ItemId作为分区键,您仍然可以通过OrderId检索,使用Scan操作,这将允许您根据任何属性进行过滤。

然而,Scan将执行全表扫描,因此真正的问题可能是您是否可以有效地通过OrderId进行检索。在这种情况下,您确实需要一个Global Secondary Index,其中OrderIdItemId作为复合属性键。

这通常是通过所谓的"单表设计"来实现的。这意味着,你将所有的数据存储在一个表中,并将其规范化存储,即复制你的数据,使其符合你的访问模式。

一般来说,如果事先不知道访问模式,dynamodb可能不适合您。对于许多系统,一个好的解决方案是拥有"主";在dynamo中访问模式,然后通过复制数据到elasticsearch之类的东西来卸载一些对性能不那么关键的临时查询。

如果你有一个哈希键PK (String)和排序键SK (String)的表,你可以这样存储你的数据。使用事务使多个项目保持最新和一致等。

tbody> <<tr>
PK SK shippingStatus totalPrice cartQuantity
order_1234order_status123123
order_1234item_abc - 1233
order_1234item_def - 3451
order_5678order_status54321
order_5678item_jkl - 9015
item_abc - 123order_1234
item_abc - 123order_9876
item_abc - 123order_5656

最新更新