适应数据库

时间:2008-08-28 13:18:24

标签: database orm

是否有任何快速的数据库原型设计工具不需要我声明数据库模式,而是根据我使用我的实体的方式创建它。

例如,假设一个空数据库(伪代码):

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

由于在动态创建架构时可以进行逻辑假设,并且您可以通过使用数据库工具稍后调整它来覆盖其选择。

此外,您可以通过单元测试来生成架构。

显然这仅适用于原型设计。

那里有这样的东西吗?

6 个答案:

答案 0 :(得分:2)

Google's Application Engine就像这样。下载工具包时,您将获得数据库引擎的本地副本以进行测试。

答案 1 :(得分: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"}

}

保存文件会自动更改架构。同样,如果您使用脚手架,它会更新。原型过程将运行应用程序,在浏览器中查看页面,修改域,刷新浏览器以及查看更改。

答案 2 :(得分:1)

我同意NHibernate方法和自动数据库生成。但是,如果您想避免编写配置文件并保持接近代码,请使用Castle的ActiveRecord。您可以使用via属性直接在类上声明'schema'。

[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();

答案 3 :(得分:0)

可能无法完全响应您的常规问题,但如果使用(N)Hibernate,则可以从hbm映射文件自动生成数据库架构。

它不是直接从您的代码中完成的,因为您似乎想要但Hibernate Schema生成似乎对我们有用

答案 4 :(得分:0)

您想要架构,但是已经生成了架构,或者您真的想要无架构吗?

对于前者,我会选择nhibernate,因为@ tom-carter说。让它为你生成你的架构,你一切都很好(至少你推出你的应用程序,然后看看像Tarantino和RedGate SQL Diff或其他所谓的生成更新脚本)

如果你想要后者......谷歌应用程序引擎这样做,正如我今天下午发现的那样,这非常好。如果你想在你的控制下坚持使用代码,我建议你看看CouchDB,这是设置它的一些前期工作。但是一旦拥有它,它就是一个完全的,100%无架构的数据库。好吧,你有一个ID和一个版本,但就是这样 - 其余的由你决定。 http://incubator.apache.org/couchdb/

但是通过它的声音(N),hibernate将是最好的,但我可能是错的。

答案 5 :(得分:0)

您可以使用对象数据库。