2013-10-18 67 views
3

我試圖在NDB中存儲層次結構,我很困惑如果在構建新實體的鍵時只應使用「父」參數,還是應該在其中包含一個額外的屬性我的模型來保存父鍵?Google App Engine中的層次結構NDB

回答

5

如果您在密鑰中使用祖先,您將創建一個大的實體組(假設樹根/層次結構爲單根),實際上可能不是您想要的寫入性能角度。另外,深層次結構可能意味着非常大的密鑰。

如果要使用祖先鍵移動節點,必須刪除並重新創建鍵的整個子層次結構,其中在父節點中存儲父節點(或父節點中的子鍵)意味着只需存儲不同的屬性中的鍵。

如果您通常走下層次結構(比如說遍歷URL),您可能會發現將子項密鑰存儲在父項的列表中會更有效率,假設每個級別都不會有太多的直接子項作爲將父密鑰存儲在孩子中。

我會在決定走哪條路之前詳細檢查您的實際需求。

+0

移動節點周圍的點是我以前沒有想到的一個很好的點!並且它達成了協議:)。非常感謝。 – 0xcurb

1

前者。您不需要創建額外的屬性,因爲它已經存儲在代表模型路徑(真的關鍵)的祖先鏈中。

閱讀此鏈接:https://developers.google.com/appengine/docs/python/datastore/entities#Python_Ancestor_paths

完整鍵識別所述實體由種類標識符對指定其祖先路徑和與這些實體本身的終止序列的:

[Person:GreatGrandpa, Person:Grandpa, Person:Dad, Person:Me] 

要指定實體的父級,請在創建子實體時使用類構造函數的父參數。這個參數的值可以是父實體本身或其關鍵字;您可以通過調用父實體的key()方法來獲取密鑰 。