2013-06-13 83 views
2

在這種情況下,歸一化不是一般的關係數據庫意義上的。GAE數據存儲:標準化?

我已收到來自用戶的報告。這些報告中的數據大致在同一時間生成,使得在一個請求中收集的所有報告的時間戳相同。

我對數據存儲還很陌生,我知道你可以查詢屬性,你必須抓住祖先實體的關鍵來遍歷...所以我想知道哪一個更好的性能和「寫/讀/等「明智。

我應該做的:

選項1:

  • 用戶(實體,ReportBundle的祖先):一般用戶信息的屬性
  • ReportBundle(實體,報告的祖先):時間戳
  • 舉報(實體):一般數據屬性

選項2:

  • 用戶(實體,報告的祖先):插入一般的用戶信息的屬性
  • 報告(實體):timestamp屬性和一般數據屬性
+0

想要知道從性能的角度來看哪種解決方案可以是最好的,你應該描述你想如何閱讀寫日期,如何閱讀和多久寫/讀哪種實體,但作爲提示,通過ID獲取總是最快的 –

+1

我的非答案是這樣的:不要擔心這個!編寫一些查詢功能並使用它們保存到數據存儲區。如果您決定要更改屬性或稍後查詢它們的方式,請執行此操作。在實際上是一個問題之前,不要擔心這個「問題」。我保證有更多有趣和重要的事情可以花費你的時間;暫時略過。現在做正確的方法做得更加方便,並且繼續生活。 – Ezra

回答

2

做選項2:

因爲,您節省了閱讀和編寫額外實體的時間。 您還可以保存數據庫操作(最終可以節省費用)。

正如我從您的選項中看到的那樣,您需要檢查timestamp屬性,以便將其放入報表對象內,
您的代碼也不那麼複雜且維護性更好。

正如Chris提到的那樣,在評論中,使用數據存儲意味着思考非規範化。

將數據存儲兩次然後再進行復雜查詢會更好,數據設計的目標應該是通過ID獲取實體。

這樣做也可以節省您可能需要的索引數量。這一點很重要。

索引數量有限的原因是因爲非規範化。
對於您創建的每個索引,數據存儲在後面創建一個新表,該表根據您的索引以正確的順序保存數據。所以當你使用索引時,你的數據已經存儲了多次。這種行爲的好處是寫入速度更快,因爲可以並行寫入所有索引表。還讀取,因爲您已根據您的索引以正確的順序讀取數據。

知道了這一點,如果只有這2個選項可用,選項2將是更好的選擇。

3

由於無法進行JOIN,我們有很多非常規化的模型。 如果您希望請求超時,您應該考慮如何處理數據。