如何存储&部署关系数据块?

时间:2011-07-27 20:08:26

标签: php postgresql testing deployment

我有一个Postgres数据库,其中包含分布在多个表中的一些配置数据。 这些配置需要在部署到生产系统之前进行测试。 现在我正在寻找一种方法

  1. 将单个配置对象及其子实体存储在SVN中,并
  2. 将具有子实体的此对象部署到不同的目标数据库
  3. 关键是对象之间的关系需要以某种方式保持,而不是实际的id,这会在将数据复制到另一个DB时引起冲突。

    例如,如果数据库包含有关音乐艺术家,专辑和曲目的数据,其中包含简单的树状表模式,如艺术家 - >有专辑 - >有轨道,然后我正在寻找的解决方案允许导出,例如一个选定的专辑与所有曲目(或一个所有专辑与所有曲目的艺术家)合并为一个文件,可以存储到SVN,然后“部署”到具有相同模式的任何数据库。

    我正在考虑自己实施某些内容,例如:具有描述依赖关系的配置文件,以及用PHP变量替换id的导出脚本,并生成某种PHP-SQL INSERT或UPDATE脚本。 但后来我觉得不要再问之前要仔细检查这样的事情是否已经存在真是愚蠢:o)

3 个答案:

答案 0 :(得分:1)

这是Natural Keys的论据之一。一张专辑有一个艺术家,由曲目组成。将这些信息链接在一起不需要“id”,只需使用名称即可。 Perl-esque数据文件示例:

"Bob Artist" => {
    "First Album" => ["My Best Song", "A Slow Song",],
    "Comeback Album" => ["One-Hit Wonder", "ORM Blues",],
}, "Noname Singer" => {
    "Parse This Record!" => ["Song Named 'D'",],
}

要添加数据,只需根据每个父级数据级别创建INSERT语句,如果必须有,请在每个INSERT语句末尾使用“RETURNING id”(PostgreSQL扩展名)来获取自动生成的id将传递到树中的下一级。

答案 1 :(得分:0)

我是马修的第二个建议。作为该概念的改进,您可能想要创建“派生自然键”,例如“Bob Artist”的“bob_artist”。例如,在将记录存储到svn中时,派生的自然键将非常适合作为文件名。

应该生成派生的自然键,使得任何两个不同的自然键导致不同的派生自然键。这样就不会在独立数据集之间发生冲突。

答案 2 :(得分:0)

Rails迁移的概念似乎相关,尽管它的主要目标是执行架构更新:http://guides.rubyonrails.org/migrations.html

这个想法已经转移到PHP中,名称为 Ruckusing ,但此时似乎只支持mySQL:http://code.google.com/p/ruckusing/wiki/BigPictureOverview

Doctrine 还提供了迁移功能,但似乎又重点关注架构转换,而不是迁移或部署数据:http://www.doctrine-project.org/projects/migrations/2.0/docs/en

可能会使用Ruckusing或Doctrine(滥用?)或者如果需要修改/扩展来完成这项工作?