2009-06-28 41 views
2

可以在GAE/J上部署同一應用程序的多個版本,但GAE/J如何處理不同版本可以使用不同數據存儲(可能不兼容)方案?數據存儲和應用程序版本如何在GAE/J上運行

例子:

假設在我的應用程序的版本1,我有一個像POJO(我已經離開了幾個細節簡單起見):

public class User { 

    private String key; 

    private String username; 

    private Integer phoneNumber; 

} 

現在假設上的版本2我想用:

public class User { 

    private String key; 

    private String username; 

    // on this version, replaced 'phoneNumber' by: 
    private String eMail; 

} 

現在兩個問題:

  1. 如果我部署兩個版本om GAE/J,我將在數據存儲中看到什麼架構?

  2. 數據本身呢?如果我在版本2上添加用戶,我會在版本1的數據存儲上看到它的數據嗎?

回答

7

引用the docs

與關係型數據庫,在App Engine數據存儲區不要求 一種給定的所有實體有 相同的屬性。應用程序可以使用SDK附帶的庫 或其自己的代碼指定並執行其數據模型 。

這也被稱爲「軟模式」 - 數據存儲並沒有真正模式,但你可以或多或少地模擬一些軟樣通過應用級代碼架構的(你自己的,或在圖書館)。所以如果你(通過庫或在你自己的代碼中)強制執行一個約束,說「這個屬性必須存在」,並且某個實體實際上並沒有該屬性(因爲它是基於不同的屬性插入的「軟模式」,例如應用程序的不同版本),那麼在檢查約束點時,您將得到應用程序級代碼或庫選擇用來指示違反此軟約束的異常。

如果你表達而沒有這種約束,那麼缺少的屬性將不得不通過你的代碼或庫,否則「默認默認」,我相信這是通常的Java null或在Python None提供的默認值。

請注意,不同版本的應用程序可能使用不同的運行時(有些可能是Java,其他可能是Python),並且不同的運行時將使用同一個數據存儲,因此Java與Python的區別在這裏並不重要。

在您的具體的例子(沒有提供默認值,沒有關於強制存在使斷言)我會期望從任一版本增加了用戶將使其從其他可見的,與被視爲null缺少的屬性(但有可能是我沒有意識到的約束,在這種情況下,當庫嘗試驗證這些約束並且看到它們被違反時會導致異常)。一般而言,我不擔心添加「可選」屬性(可能合法缺失的屬性/ null/None,或者在這些情況下具有明確的默認屬性,以便舊版本編寫的實體仍然正確但其他類型的更改(使先前缺少的或可選的屬性爲強制性的,而添加其他約束等)可能需要一種「數據庫遷移」(可能通過安全數據連接器)或「應用程序級別攻擊兼容性「,如果遷移是不可行的。

例如,如果您需要回退到之前的應用程序版本,遷移可能不可行(事實上,在其他情況下,其他操作會出現問題,例如,刪除約束與添加約束一樣有問題,因爲舊版本可能無法處理新數據中輸入的數據,這些數據違反了新版本中已刪除的限制)。

所以在實踐中它不一定是一個簡單的問題,但它仍然有助於以這種方式考慮它:數據存儲本身沒有模式,只有我的應用程序和/或它選擇使用的庫強制實施任何約束在應用層面上,底層實體本身每個實際上都有一組任意屬性 - 「軟模式」,應用層綱要,底層數據層中沒有「實際」綱要。

相關問題