DynamoDB:层级数据加条件 - 表设计

0

【以下的问题经过翻译处理】 大家好,

我正在设计我的DynamoDB表以支持一个相当简单的访问模式,但遇到了问题。我希望你们能帮我一下:)

我有4种不同的产品类型(A,B,C和D),它们都有一个价格和一个位置(国家#州#城市)。

访问模式如下:

(1) 按产品类型过滤

(2) 按产品类型和位置过滤

(3) 按产品类型,位置和价格过滤

问题是,位于USA#NY#NY的产品也必须在USA#NY和USA中可用。

为了能够按位置和价格过滤,我想出了这个解决方案,但会有许多数据重复,我相信必须有更好的解决方案:

PK |     SK & GSI PK     | GSI SK | Other product details (duplicated data)
-----------------------------------------------------------------------------------
ID | TYPE                | PRICE | Image, name, etc
ID | TYPE#USA            | PRICE | Image, name, etc
ID | TYPE#USA#NY         | PRICE | Image, name, etc
ID | TYPE#USA#NY#NY      | PRICE | Image, name, etc

这解决了每个访问模式:

(1) GSI PK = TYPE

(2) GSI PK = TYPE#USA

GSI PK = TYPE#USA#NY

GSI PK = TYPE#USA#NY#NY

(3) GSI PK = TYPE#USA & GSI SK > 150

GSI PK = TYPE#USA#NY & GSI SK > 150

读取效率高,但数据重复(价格和产品细节)并且更新一项需要多个写入。

有没有可能在不重复所有产品细节的情况下实现这一点?

编辑:我不想在价格上使用筛选表达式,因为它是最常见的筛选模式,我希望使它高效且廉价。

profile picture
专家
已提问 1 年前52 查看次数
1 回答
0

【以下的回答经过翻译处理】 我会向你展示两个备选方案(如下)。在深入了解它们之前,有几个要点需要注意。

首先,从你的schema来看,每个项目大约有5个属性,所以我预计你的项目平均大小在40-50B之间?在这个假设下,我们知道1RCU可以读取4K的数据(或者如果你可以接受最终一致性,那么可以读取8K)。以1RCU每4K为基础,你可以使用1 RCU读取100个项目。如果平均每个查询都会返回100个项目,那么你可以采用当前的schema并且过滤你不需要的项目。

其次,不要通过在应用程序代码中实现该逻辑来重复项目,你可以利用GSIs。见下面的选项#2。

因此,请查看以下内容。你的业务用例和数据形状将决定哪个选项最适合你。

==Alternate option#1== Table-PK | Table-SK | GSI-PK | GSI-SK | Price abc | xyz | TYPE | USA#NY#NY#PRICE | $x

(1) Filter by product type GSI-PK = TYPE

(2) Filter by product type and location GSI-PK = TYPE, GSI-SK starts with USA GSI-PK = TYPE, GSI-SK starts with USA#NY GSI-PK = TYPE, GSI-SK starts with USA#NY#NY

(3) Filter by product type, location and price GSI-PK = TYPE, GSI-SK starts with USA, filter (price) GSI-PK = TYPE, GSI-SK starts with USA#NY, filter (price) GSI-PK = TYPE, GSI-SK > USA#NY#NY#PRICE

==Alternate option#2== Table-PK | Table-SK | GSI-PK | GSI1-SK | GSI2-SK | GSI3-SK abc | xyz | TYPE | USA#PRICE | USA#NY#PRICE | USA#NY#NY#PRICE

(1) Filter by product type GSI-PK = TYPE

(2) Filter by product type and location GSI-PK = TYPE, GSI3-SK starts with USA GSI-PK = TYPE, GSI3-SK starts with USA#NY GSI-PK = TYPE, GSI3-SK starts with USA#NY#NY

(3) Filter by product type, location and price GSI-PK = TYPE, GSI1-SK > USA#PRICE GSI-PK = TYPE, GSI2-SK > USA#NY#PRICE GSI-PK = TYPE, GSI3-SK > USA#NY#NY#PRICE

profile picture
专家
已回答 1 年前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则