2015-07-19 47 views
0

從關係數據庫的背景來看,我發現有時候找到構建我的NoSQL數據庫的正確方法是一個挑戰(是的,我意識到這個陳述聽起來很愚蠢)。我使用DynamoDB。NoSQL數據結構

如果我有3個實體 - 用戶,報告和建築物以及許多用戶可以在建築物上提交多個報告,下面的結構是否可以接受?

User - index on userId 
Building - index on buildingId 
Report - index on reportId, userId and buildingId 

或者我需要第四個表來跟蹤用戶提交的報告嗎?我關心的問題是性能,吞吐量和存儲空間。

回答

1

使用DynamoDB時,global secondary indexes提供了替代方法來查詢表中的數據。

基於您在此處描述的表格是可以工作的結構:

用戶表

  • 散列關鍵字:用戶id

建表

  • 散列關鍵字:buildingId

報告表

  • 散列關鍵字:reportId
  • ReportUser GSI
    • 散列關鍵字:用戶id
  • BuildingUser GSI
    • 散列關鍵字:buildingId

的關鍵,上面的設計都在報告表中的全局二級索引。與主表上的散列鍵(和可選範圍鍵)不同,GSI上的散列鍵(和可選範圍鍵)不必是唯一的。這意味着您可以查詢由特定userId提交的所有報告或特定buildingId的所有報告。

在現實生活中,這些GSI可能希望包含Range鍵(如日期)以允許在查詢記錄時對其進行排序。

關於GSI的另一件事要記住的是,您需要選擇投影哪些屬性,能夠檢索,因爲GSI實際上是數據的物理副本。這也意味着GSI總是不同步更新,因此讀取總是最終一致。