2012-03-16 80 views
0

我需要一個高度可擴展的數據庫佈局。我有一個超級類「站」,將有一個唯一的ID和多個屬性。AppEngine數據庫佈局,易於擴展

station { 
    unique_identifier: id 
    ... 
} 

大多數屬性看起來像這樣

station_attribute_item { 
    referenced_station: id, 
    value: double, 
    date: date 
} 

所以你可以想像一個屬性爲具有日期部件和值列表的項目。

因此,如果我需要一個新的屬性,我添加一個新的類,就是這樣嗎?我所要做的就是查詢一個新的屬性?

new_station_attribute { 
    referenced_station: id 
    value1: string 
    value2: double 
    start: date 
    end: date 
} 

編輯:

這是數據佈局上AppEngine上的基礎設施是否可行?

+2

你問這個佈局在App Engine上是否可行?它是。它是否適合您的應用程序取決於您打算如何使用這些數據。 – 2012-03-16 19:08:00

+0

你說得對,問題在某種程度上不夠精確。 – Friedrich 2012-03-17 07:46:09

回答

0

你在做什麼是代表屬性作爲一個單獨的實體。所以你最終會得到幾個表示引用父實體的屬性(=屬性)的不同實體。

這是不可行的,原因如下:

  1. 您將無法查詢實體在幾個屬性。

  2. 如果你想要原子地改變一個實體或它的屬性(添加/刪除實體,添加/刪除/更改屬性),你必須把它們放在一個實體組中並使用事務。

  3. 您將需要使用查詢來查找實體的屬性,這是昂貴的。

  4. 當您刪除一個實體時,您需要手動查找所有屬性實體並刪除它們。

因此,總而言之,我不能推薦這種方法。

解決方案:

GAE數據存儲是一種無結構的數據庫,這意味着你可以存儲相同類型具有不同性質的實體,例如具有動態特性。問題出現在如何將動態屬性映射到類上。

在python中,你可以通過Expando class來實現。

在Java中,您可以使用low-level Entity class。低級API是最強大的,因爲它暴露了所有數據存儲功能,但是在使用「無類型」實體類而不是模型類時使用它很麻煩。

Objectify用於嵌入地圖,您可以在此地圖中添加屬性,並最終將其作爲實體中的屬性。他們在Objectify 3.1中發現了一個錯誤,並撤消了這個功能(=從文檔中刪除)。此功能will be back in Objectify 4尚未發佈,但如果您覺得自己很勇敢,則可以從後備箱構建它。