2008-08-28 52 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