自适应数据库
Posted
技术标签:
【中文标题】自适应数据库【英文标题】:Adaptive Database 【发布时间】:2008-08-28 13:18:23 【问题描述】:是否有任何快速的数据库原型制作工具不需要我声明数据库架构,而是根据我使用实体的方式创建它。
例如,假设一个空数据库(伪代码):
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
由于在动态创建架构时可以做出逻辑假设,并且您始终可以通过使用数据库工具稍后对其进行调整来覆盖其选择。
此外,您可以通过这种方式对它进行单元测试来生成您的架构。
显然这只是用于原型设计。
有这样的东西吗?
【问题讨论】:
【参考方案1】:Google's Application Engine 像这样工作。下载工具包后,您将获得用于测试的数据库引擎的本地副本。
【讨论】:
【参考方案2】: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"
保存文件会自动更改架构。同样,如果您使用脚手架,它会被更新。原型流程变为运行应用程序、在浏览器中查看页面、修改域、刷新浏览器并查看更改。
【讨论】:
【参考方案3】:我同意 NHibernate 方法和自动数据库生成。但是,如果您想避免编写配置文件,并与代码保持密切联系,请使用 Castle 的 ActiveRecord。您使用 via 属性直接在类上声明“模式”。
[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();
【讨论】:
哦,对于原型设计,使用内存中的 SQLite 数据库引擎! (此处为 ADO.NET 提供程序 sqlite.phxsoftware.com/>)【参考方案4】:可能没有完全回答您的一般问题,但如果您使用了(N)Hibernate,那么您可以从您的 hbm 映射文件自动生成数据库架构。
它不是像您想要的那样直接从您的代码中完成,但 Hibernate Schema 生成似乎对我们很有效
【讨论】:
【参考方案5】:您想要架构,但生成了它,还是您真的想要没有架构?
对于前者,正如@tom-carter 所说,我会选择 nhibernate。让它为你生成你的架构,你都很好(至少在你推出你的应用程序之前,然后看看像 Tarantino 和 RedGate SQL Diff 之类的东西或者它被称为生成更新脚本的任何东西)
如果你想要后者.... 谷歌应用引擎会这样做,正如我今天下午发现的那样,它非常好。如果您想坚持使用您控制的代码,我建议您查看 CouchDB,尽管设置它需要一些前期工作。但是一旦你拥有它,它就是一个完全 100% 无模式的数据库。好吧,您有一个 ID 和一个版本,但仅此而已 - 其余的取决于您。 http://incubator.apache.org/couchdb/
但听上去,(N)hibernate 最适合,但我可能是错的。
【讨论】:
【参考方案6】:您可以使用对象数据库。
【讨论】:
以上是关于自适应数据库的主要内容,如果未能解决你的问题,请参考以下文章