2013-08-02 21 views
1

我正在爲一個大型國際品牌設計g +應用程序。我需要創建的實體幾乎都是圖形的形式,因此有很多多對多關係(弧)連接可以在兩個方向上遍歷的節點。我正在線上閱讀所有可讀的文檔,但我還沒有發現任何特定於ndb設計最佳實踐和指南的內容。不幸的是我在nda之下,無法透露應用程序的細節,但它幾乎可以與科學會議的背景,論文,作者,論文和主題相匹配。appengine ndb上的圖形實體的最佳實踐

迄今設想的實體名單如下(與上下文轉移到匹配提到的主題):

  • 組織(如ACM)
  • 會議(如ACM多媒體)
  • 會議的問題(例如, ACM多媒體13)
  • 發佈會上軌(例如NoSQL的,機器學習,計算機視覺等)
  • 作者(如我)
  • 紙(例如「設計圖一樣分貝NDB」)

,你可以看到,我可以訪問並通過任一方向遍歷圖形(或面,從一個前端點):

  • 筆者用合着者
  • 筆者會議跟蹤
  • 會議跟蹤對文件
  • ...

等等,你填寫清單。

我想讓它變得平直和堅實,因爲它會用很多p.r.並且需要在內容和用戶數量方面不斷加班加點。我想從頭開始對它進行編碼,因此設計了我自己的模型,restful api讀/寫這些數據,避免使用非rel django並將表示層保持爲最小模板機制。我需要與公司在哪裏工作,但我們可能能夠用一個體面的開源許可證(理想情況下,ndb模型的一個寧靜的服務)發佈部分代碼。

如果任何人都可以指引我走向正確的方向,那就太棒了。

謝謝! 托馬斯

[編輯:涉及到許多一對多的關係,糾正錯字]

回答

1

有兩種方法來實現App Engine中一個一對多的關係。

  1. 實體A內部存儲實體B1,B2,B3的密鑰列表。在舊的DB中,您將使用db.Key的ListProperty。在ndb中,您將使用重複= True的KeyProperty。

  2. 內部實體B1,B2,B3將KeyProperty存儲到實體A.

如果使用1:

  • 當你有實體A,可以通過ID獲取B1,B2,B3。這可能比查詢的結果更加一致。
  • 由於您通過查詢節省了1次讀操作(假設您不計算獲取實體A的成本),因此可能會稍微便宜一些。編寫B實例稍微便宜一些,因爲它是一個更新的索引。
  • 由於A上的最大實體大小和索引屬性數量限制了您可以存儲的B實例的數量,這對於諸如會議軌道這樣的事情是有意義的,因爲通常有限數量的軌道不會去進入數千人。
  • 如果您需要對B1,B2,B3的順序進行任意排序,則將它們按順序存儲在列表中比使用一些已排序的索引屬性對它們進行排序更容易。

如果使用2:

  • 你只需要實體A的以查詢B1,B2,B3的關鍵。您實際上不需要獲取實體A來獲取列表。
  • 你可以擁有幾乎無限量的B實體。
+0

哎dragonx,感謝您抽出時間來回答,但我不知道這能解決我的問題。我認爲「referenceProperty」是指一種key =「其他實體之一」的keyProperty,對吧?我讀過這個可以輕鬆達到1mb的限制,當獲取具有很多連接的實體時,這可能是我的情況。我可能會爲簡單的相關實體使用重複的屬性,但我認爲整個數據結構可能需要依賴更「正常」的表示,因此我將弧作爲實體存儲的誘惑。說得通? – gru

+0

你是對的,KeyProperty。正如我所提到的,如果您使用方法1,您將遇到1MB的限制,但如果使用方法2則不會。我不知道「規範化」表示的含義。通過將弧存儲爲實體也不太明白你的意思。如果你的意思是你想爲圖中兩個節點之間的每個鏈接創建一個實體,那絕對是錯誤的做法。這將是昂貴的,慢取得實體。在App Engine中,如果可能的話,您通常需要進行非規範化處理,以減少您獲取的實體數量,從而節省成本並提高性能。 – dragonx

+0

uhm,我明白你的意思,但我將方法2簡單地看作方法1的鏡像版本(在我的情況下,所有實體A,B,C ...都可以與其他所有實體建立多對多的連接)所以我會再次遇到1mb的限制。有一個官方的googleplus演示應用程序,它使用我提到的存儲實體間連接的方法,[你可以在這裏看到它。](https:// github。com/googleplus/gplus-photohunt-server-python/blob/master/model.py#L122)他們不能完全錯誤,他們必須? – gru

0
深入研究後

,這有什麼發現:

  • 有沒有一個單一的設計模式可循,當然這取決於具體的應用和數據建模(不夠公平)
  • 行動應爲避免達到bottom of this page中列出的大小限制,主要針對單個實體大小(1mb),交易大小(10mb)和index limits
  • 儘可能地避免實體標準化(例如,具有僅用於創建圓弧集的實體)似乎使用GOOGLEPLUS開發者在他們的演示應用程序的simple social graph

任何其他更詳細的回答是歡迎