1 回答
TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個(gè)贊
如您所述,在 GSI 中,如果您選擇不將所有基表的列投影到索引表中,則在查詢索引時(shí)這些其他列不可用。這樣做的原因不是實(shí)施者懶惰,而是效率:在 GSI 中,索引表以與基表不同的方式分布在整個(gè) DynamoDB 集群中,因此在讀取索引表數(shù)據(jù)時(shí),沒有有效的方法也可以讀取同時(shí)從基表。順便說一下,這正是 LSI 與 GSI 的不同之處 - 在 LSI 中,索引和基表位于同一位置,并且可以一起讀取,因此 DynamoDB 確實(shí)為您提供了一種方法來請求未投影的列。
所以我認(rèn)為你有兩個(gè)選擇。一種是BatchGetItem在讀取完索引數(shù)據(jù)后,再請求讀取基表數(shù)據(jù)。請注意,當(dāng)您查詢索引時(shí),您始終可以取回基表鍵屬性,因此您可以使用這些屬性從基表中讀取完整的項(xiàng)目。BatchGetItem可能是進(jìn)行這些讀取的最有效方法,而不是使用GetItem.
當(dāng)然,第二個(gè)選項(xiàng)是將更多基本屬性(甚至全部)投影到索引表中。這會(huì)增加你的存儲和可能的讀寫成本,所以你是否要這樣做取決于你的應(yīng)用程序。在某些特定情況下,具有相同屬性的兩個(gè)索引甚至具有不同數(shù)量的投影屬性也是有意義的。
添加回答
舉報(bào)
