2010-01-09 78 views
1

我正在創建一個小問題應用程序,需要一些幫助來設計我的模型關係。這個問題可能會相當複雜,但我會盡量簡潔。數據存儲設計查詢

瑣碎問題將全部成爲特定類別的一部分。類別可能是另一類別中的類別。如果創建/刪除了一個瑣事問題,我需要確保我還更新了一個計數器。通過這種方式,我可以看到每個類別中有多少個問題,並將其顯示給用戶。如果某個類別具有「子」類別,則需要顯示所有子類別的累計計數器。準確的符合是相當重要的,但不是任務關鍵。我不介意使用分片計數器。我的問題是,我應該如何設計,以便它將採用GAE非規範化並保持優化?

我在想有一個Category類,每個ListProperty都會代表祖先樹。它將按順序包含樹中每個父實體的鍵。但是,我是否應該在構造實體時指定父項,還是在這種情況下不需要?我想我可能不得不在交易中運行櫃檯更新,這就是爲什麼我正在考慮親子關係。

或者也許有更優化的設計我的關係的方式,仍然可以讓我保持每個類別中所有問題的相當準確的計數器。預先感謝您的幫助。

+0

稍微偏離主題,但我注意到,你將使用的應用程序引擎的數據存儲。你有一些應用程序引擎和創建持久模型的經驗嗎?如果不是,我會指出App Engine的行爲與許多其他Persisten模型有些不同。我發現使用App Engine時遇到了一些約束,而不像Hibernate(在Java世界中)那樣更通用。例如查詢屬性路徑,例如你無法查詢triviaCard.someCategory.question。如果使用GAE – 2010-01-09 19:24:03

+0

,我只是想要將這些約束條件應用到您的設計中。我不確定這是否適用於您的評論,但我沒有使用Java API。 – BMac 2010-01-09 19:34:44

回答

0

這並不像您想象的那麼複雜。這裏有一個分類等級:

class Category(db.Model): 
    title = db.StringProperty() 
    subcategories = db.ListProperty(db.Key) 
    quizzes = db.ListProperty(db.Key) 

    def add_sub_category(self, title): 
     new_category = Category(title) 
     new_category.put() 
     self.subcategories.append(new_category) 
     self.put() 

     return new_category 

通過保持兩個子類別和所assocaited此類別中的ListProperty測驗,讓他們的計數與使用LEN()操作一樣簡單。

你可以使用它是這樣的:

main_category = Category("Main") 
main_category.put() 

sports_category = main_category.add_sub_category("Sports") 
baseball_category = sports_category.add_sub_category("Baseball") 
football_category = sports_category.add_sub_category("Football") 
hockey_category = sports_category.add_sub_category("Hockey") 

tv_category = main_category.add_sub_category("TV") 

...等...

+0

我只是看不到這是一個可擴展的選項。我可以在成千上萬的測驗中找到某個地方,而這看起來不像是存儲在ListProperty中的邏輯密鑰。我錯了嗎? – BMac 2010-01-09 21:51:35

+0

每個類別只存儲它所屬類別的關鍵字。 – 2010-01-09 22:05:34

+0

我指的是你的測驗= db.ListProperty(db.Key)。這似乎是該類別中每個列表的關鍵,不是嗎? – BMac 2010-01-09 22:25:23

0

我對Google App Engine並不熟悉,但這裏有一些想法。首先要考慮「標籤」是否比類別&子類別更合適。他們會是一個嚴格的2級分類計劃嗎?所有項目是否有主要和子類別分配?

而不是每個類別都有一個類,你有沒有考慮一個CategoryList類,它會有一個incrementCategoryByName(str name)方法?該類包含一個類的字典,而不必爲每個類別分配一個類的開銷。

+0

不會有嚴格的2級方案。可能會出現以下情況:娛樂 - >電視 - > Seinfeld。 我對使用標籤的擔心是某些標籤可能適用於多種類型的瑣事。例如,內戰可能是一個歷史類別,但它也可能是電影的名稱(如果存在的話)。 我會考慮您帖子的第二部分,並再次回覆。 – BMac 2010-01-09 19:29:16

+0

關於你的文章的第二部分,我不認爲這是可行的,因爲標籤可能不可行。有些情況下,不同樹木中的分類會共享相同的名稱。 – BMac 2010-01-09 19:31:34