如何将数据集与应用程序一起管理?

问题描述:

应用程序的代码和配置文件保存在代码库中。但有时,作为项目的一部分,我也有一些数据(在某些情况下可能大于100MB,大于1GB)存储在数据库中。 Git在处理代码及其更改方面做得很好,但开发团队如何轻松共享数据?如何将数据集与应用程序一起管理?

它并不真正适合在代码版本控制系统,因为它主要是大型的二进制文件,并会作出获取更新的噩梦。但它必须与存储库同步,因为一些代码修订版会更改模式(即迁移)。

你如何处理这种情况?

+0

通过数据你的意思是在一个数据库或其他地方的一些平面文件(如电影或MP3文件的集合例如)数据? – slebetman 2010-08-01 19:19:16

+0

在我的情况下,它的数据库。我可以将它导出到一些XML/JSON/SQL文件,但这将是一个非常大的文件。 – 2010-08-02 03:43:48

我们有存储在XML数据和架构,并使用liquibase处理架构更新和数据两者。这样做的好处是您可以区分文件以查看正在发生的事情,它可以很好地与任何VCS配合使用,并且可以将其自动化。

由于数据库的大小,这意味着相当大的“版本0”文件。但是,使用迁移策略之后,更新应该可以管理,因为它们只会是增量。您可以将现有的迁移一对一地转换为liquibase,这可能比大爆炸更好。

您还可以利用@belisarius'的策略,如果您的增量非常大,因此每个开发人员不必单独申请的增量。

我们通常使用数据库同步或复制架构。

每个开发者都有数据库的2个副本,一个用于工作,另一个只是为了保持同步版本。

当代码是同步的,脚本同步数据库太大(相对于“死”开发商的副本中央DB)。之后,每个开发人员更新他自己的工作副本。有时开发人员需要保留一些他/她的数据,因此这些第二次更新并不总是由标准脚本驱动。

是一样强大的复制模式....有时(取决于DB),并不代表好消息。

在我看来,你的数据库有很多与二进制库相关的相似之处:这是大的(当然,不是一个合理的代码库大得多!),二进制,并有自己的版本,它必须对应于各种版本的代码库。

考虑到这一点,为什么不依赖管理器(例如Apache Ivy)与构建过程集成,并让它管理您的数据库?这看起来就像是一个依赖管理器的构建任务。除非您可以将数据序列化为可变量格式(XML/XML格式),否则关于数据/下载的庞大规模,我认为没有任何神奇的项目符号(缺少一些严重的文档预加载基础结构)你提到的JSON/SQL)。

第二种方法(可能与依赖管理不兼容):如果代码的具体情况允许,则可以保留第二个文件,该文件是手动比较,可以将基本数据库(版本0)数据库直到版本X.每个开发人员都需要保持一个干净的版本0.一个拉(具有更改的数据库的版本)将包括:拉差异文件,将版本0复制到工作数据库,应用差异文件。请注意,应用diff文件可能需要一段时间才能处理较大的数据库,因此您可能无法像在第一次看到时那样节省直接下载的时间。

+0

感谢Greg,您的第一个解决方案听起来很酷。我会检查出来的。 你的第二个解决方案 - 数据库数据迁移 - 在理论上是非常好的,但我无法在现实生活中使用它(我正在使用它,这就是我的问题的原因)。这需要比评论更长的时间来解释原因。我应该写一篇关于它的博客文章:) – 2010-08-31 08:59:37

+0

@Ofri,当然有道理。对于一般情况来说,这仍然可能有用 - 这是我发现自己在类似情况下最经常做的事情。不幸的是,我认为会有一些大的下载并且没有办法解决这个问题......我们已经通过了拨号上网的好事。 :-) – Greg 2010-08-31 14:07:55

+0

我认为关键部分是“哪些必须对应于您的代码库的各种版本。” 。我们发现并非所有开发人员都同意这一点,因为他们的单元测试数据(例如)演化速度太快......比他们预期的代码提交速度快得多。只是我2C – 2010-08-31 23:24:26

DataGrove是一个新产品,让你的数据库版本控制。我们允许您在任何时间点存储整个数据库(模式和数据),标记,恢复和共享数据库。

这听起来像是你在找什么。

我们目前正在对功能,让混帐样(推挽)行为,因此开发人员可以跨机器共享他们的仓库,所以,当我需要它,我可以加载最新版本的数据库。