我有一個關於Google數據庫雲端數據存儲的設計問題。讓我用一個例子來解釋它:數據存儲設計 - 如何模擬高效連接
我有那種實體「文章」具有以下屬性:
- 標題
- 用戶id
- ....
- sumOfScore
相撲fScore應該是所有相關的 「分數」 的實體,它具有 性質類似的總和:
- 條款ArticleID
- 用戶id
- 得分
僞SQL:
sumOfScore =從分數中選擇總和(分數),其中score.articleId = article.id
我看到兩種可能性來設計這個(使用谷歌的數據存儲API):
1)無財產sumOfScore的文章;但總是查詢:
這意味着:每次閱讀文章時,我需要爲計算sumOfScore的特定文章進行查詢。想象一下顯示給用戶的100篇文章的列表。這將需要額外的100個查詢到數據庫,只是爲了顯示每篇文章的分數。
儘管如此:當使用Relational-DB時,這將是我的首選方式。沒有冗餘和良好的標準化。 使用SQL,只需使用一個連接選擇即可捕獲所有數據。 但是它對雲數據存儲感覺不合適。
2)每當分數實體改變後計算sumOfScore:
這意味着:每當分數實體添加,刪除或更改,相關文章 更新sumOfScore財產。
優點:閱讀文章時不需要額外的查詢。 sumOfScore在實體本身上是多餘的。
缺點:每次更改分數時,都會有一個額外的查詢和一個額外的寫入(更新一個Article實體)。 sumOfScore可能與實際得分實體不匹配(例如,通過DB-Console更改值)
什麼是更有經驗的人認爲?這種情況下是否有一個常見的最佳做法? 什麼是在引擎蓋下做JPA或JDO實現?
非常感謝
莫斯
您實際上並沒有使用Bigtable - 您使用的是App Engine數據存儲,它恰好建立在它上面,但提供了更多的功能。 –