2008-08-28 72 views
1

是否有任何快速的數據庫原型工具不需要我聲明數據庫模式,而是基於我使用我的實體的方式創建它。Adaptive Database

例如,假設一個空數據庫(僞代碼):

user1 = new User() // Creates the user table with a single id column 
user1.firstName = "Allain" // alters the table to have a firstName column as varchar(255) 

user2 = new User() // Reuses the table 
user2.firstName = "Bob" 
user2.lastName = "Loblaw" // Alters the table to have a last name column 

既然有可以在動態創建的模式進行邏輯假設,你總是可以使用您的數據庫工具替代它的選擇稍後再調整它。

此外,你可以通過這種方式進行單元測試來生成你的模式。

顯然這隻適用於原型設計。

有沒有這樣的東西呢?

回答

2

Google's Application Engine的工作原理是這樣的。當您下載工具包時,您將獲得數據庫引擎的本地副本以進行測試。

0

可能不完全迴應您的一般問題,但如果您使用(N)Hibernate那麼您可以從您的hbm映射文件自動生成數據庫模式。

它並不像你似乎想,但休眠模式生成似乎也爲我們工作

1

Grails的代碼直接進行使用Hibernate持久化域對象,併產生類似於你描述的行爲。要更改模式,只需修改域,在這種簡單情況下,該文件名爲User.groovy。

class User { 

    String userName 
    String firstName 
    String lastName 
    Date dateCreated 
    Date lastUpdated 

    static constraints = { 
     userName(blank: false, unique: true) 
     firstName(blank: false) 
     lastName(blank: false) 
    } 

    String toString() {"$lastName, $firstName"} 

} 

保存文件會自動更改模式。同樣,如果您使用腳手架,它將被更新。原型進程運行應用程序,在瀏覽器中查看頁面,修改域,刷新瀏覽器並查看更改。

0

你想要架構,但它已生成,或者你真的想要沒有架構

對於前者,我會用nhibernate作爲@ tom-carter說的。讓它爲你生成模式,並且你都很好(至少在你將應用推出之前,然後看看像Tarantino和RedGate SQL Diff或者其他所謂的產生更新腳本的東西)

如果你想要後者....谷歌應用程序引擎這樣做,正如我今天下午發現的,它非常好。如果你想堅持你的控制下的代碼,我會建議看看CouchDB,這是一個前端工作得到它設置。但是一旦擁有了它,它就是一個完全免費的無模式數據庫。那麼,你有一個ID和一個版本,但多數民衆贊成 - 它的其餘部分取決於你。 http://incubator.apache.org/couchdb/

但是通過它的聲音(N)hibernate將套件最好,但我可能是錯的。

0

您可以使用對象數據庫。

1

我同意NHibernate的方法和自動數據庫生成。但是,如果你想避免寫一個配置文件,並保持接近代碼,使用城堡的ActiveRecord。你通過通過屬性直接在類上聲明'模式'。

[ActiveRecord] 
public class User : ActiveRecordBase<User> 
{ 
    [PrimaryKey] 
    public Int32 UserId { get; set; } 

    [Property] 
    public String FirstName { get; set; } 
} 

有很多種,你可以應用約束(驗證,範圍等),你可以聲明不同的數據模型類之間的關係。大多數這些選項都是添加到屬性中的參數。這很簡單。

所以,你正在使用代碼。在代碼中聲明用法。當你完成後,讓ActiveRecord create the database

ActiveRecordStarter.Initialize(); 
ActiveRecordStarter.CreateSchema(); 
+0

哦,對於原型設計,請使用內存中的SQLite數據庫引擎! (ADO.NET提供者在這裏) – 2008-09-09 14:58:59