Php 如何储存&;部署关系数据块?
我有一个Postgres DB,其中包含分布在多个表中的一些配置数据。 在将这些配置部署到生产系统之前,需要对其进行测试。 现在我正在寻找一种方法Php 如何储存&;部署关系数据块?,php,postgresql,testing,deployment,Php,Postgresql,Testing,Deployment,我有一个Postgres DB,其中包含分布在多个表中的一些配置数据。 在将这些配置部署到生产系统之前,需要对其进行测试。 现在我正在寻找一种方法 在SVN中存储单个配置对象及其子实体,以及 将此对象和子实体部署到不同的目标数据库 关键是,需要以某种方式维护对象之间的关系,而不使用实际id,这会在将数据复制到另一个DB时导致冲突 例如,如果数据库包含关于音乐艺术家、专辑和曲目的数据,并具有简单的树表模式,如artist->has albums->has tracks,则我正在寻找的解决方案将允许
但后来我想,如果之前不要求再次检查这样的东西是否已经存在,那将是非常愚蠢的:o)这是自然键的一个论点。专辑有一位艺术家,由曲目组成。无需“id”将这些信息链接在一起,只需使用名称即可。Perl风格的数据文件示例:
"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语句,则在每个INSERT语句末尾使用“RETURNING id”(PostgreSQL扩展名),以获取自动生成的id,并将其传递到树的下一个级别。这是自然键的参数之一。专辑有一位艺术家,由曲目组成。无需“id”将这些信息链接在一起,只需使用名称即可。Perl风格的数据文件示例:
"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语句,则在每个INSERT语句末尾使用“RETURNING id”(PostgreSQL扩展名),以获取自动生成的id,并将其传递到树中的下一个级别。我同意Matthew的建议。作为对该概念的改进,您可能希望创建“派生自然关键点”,例如“bob艺术家”的“bob_艺术家”。例如,当将记录存储到svn中时,派生的自然密钥非常适合作为文件名
应生成派生自然密钥,以使任意两个不同的自然密钥产生不同的派生自然密钥。这样,独立数据集之间就不会发生冲突。我同意马修的建议。作为对该概念的改进,您可能希望创建“派生自然关键点”,例如“bob艺术家”的“bob_艺术家”。例如,当将记录存储到svn中时,派生的自然密钥非常适合作为文件名
应生成派生自然密钥,以使任意两个不同的自然密钥产生不同的派生自然密钥。这样,独立数据集之间就不会发生冲突。Rails迁移的概念似乎是相关的,尽管其主要目的是执行模式更新: 这个想法已经被转换成PHP,名称为Ruckusing,但目前似乎只支持mySQL: 原则还提供迁移功能,但似乎再次将重点放在架构转换上,而不是迁移或部署数据:
可能会使用(滥用?)喧闹或条令,或者如果需要修改/扩展以完成工作?Rails迁移的概念似乎很相关,尽管它主要用于执行模式更新: 这个想法已经被转换成PHP,名称为Ruckusing,但目前似乎只支持mySQL: 原则还提供迁移功能,但似乎再次将重点放在架构转换上,而不是迁移或部署数据:
可能会使用(滥用?)喧闹或条令,或者如果需要修改/扩展来完成工作?我试图澄清:我寻找一个现有的解决方案,最好是Postgres&PHP,它允许将这些数据导出到可用于插入或更新的文件中。与mySQL不同的是,Postgres不知道在重复密钥更新时UPSERT/MERGE INTO/REPLACE INTO/ON DUPLICATE KEY UPDATE或诸如此类的事情。还有一件事:在我的例子中,如果实体已经存在,则删除CASCADE不是一个选项,因为这基本上总是会删除整个数据库。(要继续使用艺术家示例,请考虑由多个艺术家编辑专辑和曲目)。这意味着需要有一些逻辑来检查实体是否已经存在,它会更新(不更改id)并仅删除那些在最新版本中不再存在的子实体,同时更新现有实体并插入新实体。“我试图澄清”和“还有一件事”是您问题的一部分。请编辑此问题以包含所有事实。编辑问题后,请删除注释。我试图澄清:我寻找一个现有的解决方案,最好是Postgres和PHP,它允许将这些数据导出到可用于插入或更新的文件中。与mySQL不同的是,Postgres不知道在重复密钥更新时UPSERT/MERGE INTO/REPLACE INTO/ON DUPLICATE KEY UPDATE或诸如此类的事情。还有一件事:在我的例子中,如果实体已经存在,则删除CASCADE不是一个选项,因为这基本上总是会删除整个数据库。(要继续使用艺术家示例,请考虑由多个艺术家编辑专辑和曲目)。这意味着需要一些逻辑来检查实体是否已经存在,即