我是DynamoDB的新手,试图弄清楚如何构建我的数据/表/索引。我的模式包括一个itemid
(唯一的)和一个orderid
(每个订单有多个项目),以及其他一些任意属性。我希望能够通过其itemid
检索单个项目,但也可以通过其OrderId
检索一组项目。
我最初的直觉是将itemid设置为主键,将orderid设置为排序键,但这不允许我仅通过orderid进行查询。然而,如果我把它们倒过来,也会出现同样的问题。
示例数据:
ItemId | OrderId | abc - 123 | 1234 |
---|---|
def - 345 | 1234 |
ghi - 678 | 5678 |
. jkl - 901 | 5678 |
如果你的问题真的是你是否"能够";要做到这一点,那么使用ItemId
作为分区键,您仍然可以通过OrderId
检索,使用Scan
操作,这将允许您根据任何属性进行过滤。
然而,Scan
将执行全表扫描,因此真正的问题可能是您是否可以有效地通过OrderId
进行检索。在这种情况下,您确实需要一个Global Secondary Index,其中OrderId
和ItemId
作为复合属性键。
这通常是通过所谓的"单表设计"来实现的。这意味着,你将所有的数据存储在一个表中,并将其规范化存储,即复制你的数据,使其符合你的访问模式。
一般来说,如果事先不知道访问模式,dynamodb可能不适合您。对于许多系统,一个好的解决方案是拥有"主";在dynamo中访问模式,然后通过复制数据到elasticsearch之类的东西来卸载一些对性能不那么关键的临时查询。
如果你有一个哈希键PK (String)和排序键SK (String)的表,你可以这样存储你的数据。使用事务使多个项目保持最新和一致等。
PK | SK | shippingStatus | totalPrice | cartQuantity | order_1234 | order_status | 在 | 123123 |
---|---|---|---|---|
order_1234 | item_abc - 123 | 3 | ||
order_1234 | item_def - 345 | 1 | ||
order_5678 | order_status | 运 | 54321 | |
order_5678 | item_jkl - 901 | 5 | ||
item_abc - 123 | order_1234 | |||
item_abc - 123 | order_9876 | |||
item_abc - 123 | order_5656 |