2010-09-01 50 views
5

我是新的谷歌應用程序引擎和谷歌數據存儲(bigtable),我有一些疑問,可能是最好的方法來設計所需的數據模型。建模分層數據 - GAE

我需要創建一個層次結構模型,就像產品目錄一樣,每個域都有一些深層次的子域。目前產品的結構變化小於讀取要求。酒例如:

  • 原產地(托斯卡納,貝利奧拉特,阿爾薩斯)
  • 酒廠(只屬於一個產地)
  • 酒(只屬於一個酒莊)

所有的關係是不相交併且不完整。此外,在要求順序可能是我們需要(可能需要交易)

存儲使用計數器逢酒在本文檔的順序似乎還有很不同的可能的解決方案:

  • 祖先管理。使用父母關係和交易
  • 僞祖先管理。使用db.ListProperty(db.Key)模擬祖先
  • ReferenceProperty。指定類別之間的關係

但按照預期的要求得到葡萄酒......有時是由品種,有時由來源,有時由酒廠......我擔心查詢的行爲使用這些結構(如關係模型中的多個連接)如果您要求產品家族...您需要加入產品樹中的最終深度限定符並加入家庭)

也許更好地創建一些重複的信息(按照谷歌團隊的建議順序:操作昂貴,但存儲不是,所以重複的內容不應該被看作是主要問題)

的其他類似的問題有些回覆建議:

  • 商店所有父ID作爲字符串中的一個層次......就像一個path屬性
  • 複製的飲料實體之間的關係的所有的父母在樹...

有什麼建議嗎?


威爾嗨,

我們的情況下,更多的是一種嚴格的分層方法,你在第二個例子中表示。而查詢是用於檢索產品列表,只檢索一個不正常。

我們需要檢索所有來自原產地的葡萄酒,從釀酒廠或來自不同(如果我們supose該品種是嚴格的分層樹的另一個節點,僅是一個例子)

一種方法能是包括路徑屬性,如你所提到的:

  • /產地/ {ID} /酒廠/ {ID} /各種/(編號)

,讓我來檢索葡萄酒列表一個品種應用這樣的查詢:

wines_query = Wine.all() 
wines_query.filter('key_name >','/origin/toscana/winery/latoscana/variety/merlot/') 
wines_query.filter('key_name <','/origin/toscana/winery/latoscana/variety/merlot/zzzzzzzz') 

或者這樣從產地:

wines_query = Wine.all() 
wines_query.filter('key_name >','/origin/toscana/') 
wines_query.filter('key_name <','/origin/toscana/zzzzzz') 

謝謝!

+0

我不明白你的問題更新。 「品種」如何適應層次結構?來自不同來源和/或釀酒廠的葡萄酒是否具有相同的品種?如果是這樣的話,我認爲這個品種必須是'Wine'模型的一個屬性。我也不明白你的查詢完成了我自己的示例查詢不是。 – 2010-09-02 14:00:14

回答

1

我不知道你需要在除了在問題中提到的那些做什麼類型的查詢,但在明確的祖先層次存儲數據會讓你問起掉下來很容易地的人。

例如,從特定的原產地獲取所有的葡萄酒:

origin_key = db.Key.from_path('Origin', 123) 
wines_query = db.Query(Wine).ancestor(origin_key) 

或獲取某個特定酒莊所有的葡萄酒:

origin_key = db.Key.from_path('Origin', 123) 
winery_key = db.Key.from_path('Winery', 456, parent=origin_key) 
wines_query = db.Query(Wine).ancestor(winery_key) 

,並假設你存儲的品種葡萄酒模型上的一個屬性,特定品種的所有葡萄酒都如此簡單

wines_query = Wine.all().filter('variety =', 'merlot') 

On這種嚴格的分層方法可能存在的缺點是它可能會強加給你的那種URL方案。隨着看起來像

Origin -> Winery -> Wine 

必須以建立一鍵檢索葡萄酒瞭解葡萄酒的起源酒廠的鍵名或ID的層次結構。除非你已經有了葡萄酒鑰匙的字符串表示。這基本上迫使你對葡萄酒的URL中的下列形式之一:

  • /origin/{id}/winery/{id}/wine/{id}
  • /wine/{opaque and unfriendly datastore key as a string}

(第一個URL當然可以用查詢字符串參數來代替;重要的部分是你需要三個不同的信息來識別一個給定的酒。)

可能還有其他的替代品還沒有發生,我這些URL方案,雖然。

+0

謝謝你,我按照你的回答順序更新了問題。 – 2010-09-02 08:43:50