16

對不起,如果這個問題太簡單了,我只進入9年級。Google App Engine數據存儲區中最有效的一對多關係?

我想了解NoSQL數據庫設計。我想設計一個Google數據存儲模型,以最大限度地減少讀/寫次數。

下面是在一個一對多關係的博客文章和評論的玩具例子。哪種方法更高效 - 將所有註釋存儲在StructuredProperty中,或在Comment模型中使用KeyProperty?

此外,其目標是最大限度地減少對數據存儲的讀取/寫入次數。你可以做出以下假設:

  • 評論將不會獨立於各自的博客文章檢索。 (我懷疑,這使得最優選的StructuredProperty。)
  • 評論將需要按日期,等級,作者等排序(數據存儲中的子屬性不能被索引,所以,這可能會影響性能?)
  • 博客文章和評論可以在創建後進行編輯(甚至刪除)。

使用StructuredProperty:

from google.appengine.ext import ndb 

class Comment(ndb.Model): 
    various properties... 

class BlogPost(ndb.Model): 
    comments = ndb.StructuredProperty(Comment, repeated=True) 
    various other properties... 

使用KeyProperty:

from google.appengine.ext import ndb 

class BlogPost(ndb.Model): 
    various properties... 

class Comment(ndb.Model): 
    blogPost = ndb.KeyProperty(kind=BlogPost) 
    various other properties... 

隨意彈出,涉及到有效地代表與問候到最小化一個一對多的關係,任何其他考慮因素讀/寫數據存儲的次數。

謝謝。

+0

請考慮您將如何解決評論和博客帖子總大小超過1MB的問題。它能發生嗎?如果可以,並且你沒有一個好的解決方案來處理它,那麼從純粹的功能角度來看,你甚至不會打擾包含兩者的單個實體。 – 2012-08-01 06:30:28

+0

另一種方法可能是將所有註釋的關鍵字存儲在博客文章中。然後你可以用一個ndb.get_multi(keys)檢索所有的評論,但是可以提供更多的評論,如果你仍然超過1MB,那麼你可以單獨檢索評論 – 2012-08-01 06:38:04

回答

13

我可能是錯的,但是從我的理解,一個StructuredProperty只是一個實體中的屬性,但子屬性。

這意味着閱讀BlogPost及其所有評論只需花費一次閱讀。所以當你渲染你的頁面時,你只需要一次讀取你的整個頁面。

寫入每個也會更便宜。您需要一次讀取操作來獲取BlogPost,並且只要您不更新任何索引屬性,它就只是一個寫操作。

您可以處理的評論自己的排序,你讀出的實體數據存儲之後。與交易

你必須同步您的評論更新/編輯,以確保一個評論不覆蓋其他,因爲它們都修改同一個實體。如果每個人都在同一時間評論和編輯同一篇博文,您可能會遇到難以解決的問題。

雖然在成本優化,你會碰了壁帶1MB的最大實體尺寸。這將限制您可以爲每篇博文存儲的評論數量。

使用KeyProperty將會相當昂貴。

你需要一個讀來獲取博客文章,再加上1個查詢併爲每個評論1次小的讀取運算。

每個評論是一個新的實體,所以它至少會有4個寫操作。您可能想要對排序順序進行索引,這樣最終會花費更多的寫操作。

從好的一面來看,每篇博文都會有無限的評論,您不必擔心同步新評論。您可能需要擔心編輯註釋的同步,但如果將編輯限制爲創建者,那應該不是問題。你不必自己排序。

這是一個成本與功能的權衡。

3

什麼:

from google.appengine.ext import ndb 

class Comment(ndb.Model): 
    various properties... 

class BlogPost(ndb.Model): 
    comments = ndb.KeyProperty(Comment, repeated=True) 
    various other properties... 

這樣,您就可以存儲多達獨立每篇博客文章的大小,每博客文章(重複屬性的最大數量)5000條評論。你不需要查詢來獲取博客的評論,你可以做ndb.get_multi(blog_post.comments)。對於此操作,您可以嘗試依賴ndb的內存緩存。當然,這取決於你的用例,這是否是一個好的假設。

1

使用重複StructuredProperty時,要注意這個警告的:

,如果你有超過100-1000值不要使用重複的屬性。 (1000可能已經在推動它。)它們不是爲這種使用而設計的。

查看Guido的回答GAE ndb design, performance and use of repeated properties

因此,儘管您不可能使用StructuredProperty達到1 MB實體限制,但您可以輕鬆達到100-1000建議的最大值。

+0

所以有什麼選擇?只是KeyProperty,就像在問題中一樣?或者,還有更好的方法? – Ajedi32 2015-10-26 16:55:53

+0

如果低於100-1000的數值限制,KeyProperty可以工作,但如果您有更多的工作,我會考慮重新考慮您的數據模型和需要的功能。在博客示例中,將註釋存儲爲單個JSONProperty也可以。這樣你只更新/閱讀1個實體(BlogPost)並更新其JSONProperty的註釋。這與沒有100-1000數值限制的StructuredProperty解決方案相似。當然,如果實體大於1 MB,這將不起作用(除非將它分成多個實體......),但這可能適用於您的用例。 – 2015-10-29 20:54:52

相關問題