2017-05-07 43 views
0

我對如何爲給定查詢需求設置表和索引的最佳實踐感興趣。我對分區和排序鍵或LSI和GSI二級索引等相關概念有了基本的瞭解,但是將它們放在一起並設計一個或多個支持可觸及示例的索引的表存在問題。DynamoDB中的數據庫設計:書籤存儲

我看到的例子是「書籤存儲」,其中多個用戶可以將書籤存儲到URL並用一些標籤對其進行註釋。 A User有多個Urls(=書籤)。每個Url都有一個日期,可以有一個或多個Tags

的書籤可能具有以下基本結構:

{ 
    "user": "watQuadrat", 
    "url": "http://stackoverflow.com", 
    "date": 1494161436362, 
    "tags": [ "forum", "programming" ] 
} 

在這一點上我最大的問題是如何建立的表結構,這樣我可以適應各種不同的方式中的數據可以查詢,例如:

  • 列出所有TagsUser,由用戶多久使用的標籤
  • 列出所有Tags爲排序,按字母順序
  • 列出所有Tags分類爲Url,通過這個標籤是如何經常地給出了網址
  • 列出所有Tags匹配一個給定的搜索字符串,排序排序多久使用了標籤(例如搜索「店」,返回匹配所有的標記,如由他們是如何經常使用「購物」的順序)
  • 列出所有UrlsUser,按日期排序
  • 列出所有UrlsUserTag,按日期排序
  • 列出所有UrlsTag,由標籤是如何經常地給每個URL
  • 列出所有UsersUrl,按日期排序排序

這將如何設計,以便我可以以高性能的方式執行所有這些查詢?當您另外嘗試降低成本時,您是否會設計出任何不同?

回答

1

考慮到您描述的情況,我會按照下面提到的設計表格。在這裏,我假定一個用戶只能從給定的url創建一個書籤。此外,我還使用了一個名爲TagCount的新派生屬性,它表示該書籤的標籤計數。

表結構

主分區鍵:用戶名

主排序關鍵字:URL

本地二級索引

指數1

分區鍵:用戶名

排序鍵:日期

指數2

分區鍵:用戶名

排序鍵:TagCount

全球輔助索引

指數1

分區鍵:URL

排序鍵:日期

指數2

分區鍵:URL

排序鍵:TagCount

有了這個設計您可以按照以下方式進行查詢。

  • 列出所有標籤的用戶,通過數排序利用LSI用戶名,TagCount

  • 列出所有標籤爲一個網址,通過計數

    查詢排序

    查詢使用GSI Url-TagCount

  • 列出匹配給定字符串的所有標籤,按數量排序

    我假設您在此處指的字符串屬於url。如果是這樣,你將不得不進行掃描

  • 列出的所有URL的用戶,按日期排序利用LSI用戶id-日期

  • 列出所有網址,用戶和

    查詢標籤,按日期排序

    查詢LSI用戶ID,日期表過濾器表達式搜索標籤

  • 列出的所有URL的標籤,通過數排序

    你必須做一個掃描這裏

  • 列出所有用戶一個網址,按日期排序

    查詢URL-GSI日期

如果您關心成本。您可以根據您所期望的查詢模式放棄一些GSI。

更新1

考慮到更新的要求,因爲有基於標籤的許多問題,我覺得應該有第二個表結構如下

主分區鍵:標籤名 主排序關鍵字:用戶名

全球二次Indexe

分區鍵:用戶名

排序鍵:用途 - 衍生屬性相似的標記計數,標籤的總使用

+0

我想使用的用戶標識作爲分區鍵和URL作爲排序關鍵也是。通過閱讀你的答案,我意識到我沒有足夠精確地描述我的查詢需求,所以我相應地更新了我的問題。我希望現在查詢要求是可以理解的。 感謝您的幫助和見解! – Codepunkt

+1

嘿,這很有趣。我根據您提到的更新要求更新了答案。 – Asanka