我是新的谷歌應用程序引擎和谷歌數據存儲(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')
謝謝!
我不明白你的問題更新。 「品種」如何適應層次結構?來自不同來源和/或釀酒廠的葡萄酒是否具有相同的品種?如果是這樣的話,我認爲這個品種必須是'Wine'模型的一個屬性。我也不明白你的查詢完成了我自己的示例查詢不是。 – 2010-09-02 14:00:14