2015-03-13 76 views
1

我即將創建我的第一個dynamodb表,並且無法找到合適的解決方案來模擬我的需求。這聽起來很基本,但可能我的大腦仍然過多進入關係數據庫領域。使用dynamodb獲取正確的數據模型

我想要做類似這樣的店的東西:

用戶可以購買產品(一次或多次)。我想存儲爲usernameproduct_id

我以後需要查詢的唯一的事情是:

  • 該產品已通過用戶購買X
  • 多少次被他們購買

首先,我考慮過擁有兩個屬性的項目:usernameproduct_id。但我不能用username作爲主鍵(用戶可購買一次以上),我也不能用戶username + product_id(用戶可以購買一個產品多次)

現在我會去爲usernameproduct_idcounter和以username + product_id作爲主鍵。但是,我總是需要首先檢查產品是否已經購買並更新,否則創建一個新條目。要獲取用戶的所有產品,我將在username上創建一個全局二級索引。

但是,我不太確定這是否正確。任何反饋都會很棒!

回答

1

有可能有很多方法可以做到這一點,我不知道所有的要求,所以我不能保證這是你的正確答案,但根據你的描述,這是我會做的。

首先,我假設每個訂單都有某種與之相關的唯一訂單號。我將使用此訂單號作爲表格的主鍵。我不會使用範圍鍵。這將確保滿足所有主鍵都是唯一的約束。另外,當我將數據寫入DynamoDB時,我還會將用戶名和product_id寫爲其他屬性。

接下來,我將創建一個使用用戶名作爲主鍵和product_id作爲範圍鍵的全局二級索引。與表格的主鍵不同,GSI密鑰不必是唯一的,因此如果用戶不止一次購買特定產品,那就沒有問題。此GSI允許我執行查詢,例如「通過用戶名查找所有訂單」或「查找用戶名購買product_id的所有訂單」。

如果您還需要執行類似「查找購買product_id的所有用戶名」的查詢,則需要另一個GSI,它使用product_id作爲主鍵和用戶名作爲範圍鍵。

+1

感謝您分享您的想法!不幸的是,在我的情況下沒有可用的訂單ID。由於我唯一的要求就是上面的要求,所以我發現了一種更簡單的方法來模擬它:作爲主鍵的「用戶名」和作爲所有已購買產品的列表的「product_ids」。 – linqu 2015-03-13 14:34:48

+0

garnaat是對的。如果你沒有訂單號,那還是可以的。只需使用用戶名作爲主鍵和product_id作爲範圍鍵即可。 – 2015-03-14 22:15:03

相關問題