2017-03-08 82 views
0

我是相當新的DynamoDB,目前我們正在考慮使用DynamoDB現有項目遷移到無服務器應用程序,我們希望從關係數據庫管理系統數據庫適應以下設置:DynamoDB查詢與多個標籤

表:

  • 項目(專案編號
  • 文件(寫到FileID專案編號,文件名)
  • 標籤(寫到FileID,標籤)

我們希望與DynamoDB查詢來獲取所有文件特定項目(由專案編號)與一個或多個標籤(按標籤)。在關係數據庫管理系統這個查詢將是簡單的東西,如:

SELECT * FROM Files JOIN Tags ON Tags.FileID = Files.FileID WHERE Files.ProjectID = ?PROJECT AND Tags.Tag = ?TAG_1 OR ?TAG_2 ...

目前,我們有以下DynamoDB設置(但它仍然可以更改):

  • 項目(專案編號[ HashKey],...)
  • 文件(專案編號[HashKey],寫到FileID [RangeKey],...)

也請考慮該項目耳鼻喉科的數量ries是巨大的(介於1000 - 30000之間),也是每個項目的文件數量(介於50到100.000之間),查詢速度應該很快。

如何使用DynamoDB查詢實現這一點,最好不使用過濾器表達式,因爲它們在數據選擇之後應用?如果表文件可能具有StringSet標記作爲列,但我想這不能用於高效的DynamoDB查詢(因此不使用DynamoDB掃描),因爲DynamoDB-indices只能是String類型,二進制和數字,而不是類型的StringSet?這可能是Global Secondary Index(GSI)的適用用例嗎?

回答

1

有點遲了,剛纔看到這個問題引用了另外一個。

我想你已經去解決了這樣的事情?

DynamoDB表

  • 項目(專案編號[HashKey],...)
  • 文件(專案編號[HashKey],寫到FileID [RangeKey],...)
  • 標籤(標籤[HashKey ],寫到FileID [RangeKey],專案編號[LSI排序關鍵字])

在FileTags,需要寫到FileID使主鍵唯一的,但你可以添加專案編號作爲一種關鍵的本地二級索引,所以你可以搜索Tag + ProjectID。

這是某種數據非規範化,但是這正是NoSQL所需要的:-(例如,如果您的文件將切換到另一個項目,則不僅需要在文件上更新ProjectID,還需要在所有標籤上更新ProjectID。