代码之家  ›  专栏  ›  技术社区  ›  Humpton

开发和生产数据库?

  •  11
  • Humpton  · 技术社区  · 17 年前

    我正在使用PHP&mySQL。我终于开始关注源代码控制,对PHP部分的整个开发(测试)v production v repository非常满意。

    我的新窘境是如何处理数据库。我是否为测试环境和生产环境创建一个?我现在只有两个环境都使用的一个,把我的测试数据放在那里。我觉得我应该有两个,但是我很紧张,我要确保我的生产数据库看起来和感觉与我的测试数据库完全一样。

    你有什么想法吗?如果您认为是后者,那么保持两个数据库相同的最佳方法是什么(当然,除了数据之外…)?

    7 回复  |  直到 17 年前
        1
  •  19
  •   ahockley    17 年前

    每个环境都应该有一个单独的数据库。编写所有数据库对象(表、视图、过程等)的脚本,并将脚本存储在源代码管理中。这些脚本首先应用于开发数据库,然后升级为测试(QA、UAT等),然后再生产。通过对每个数据库应用相同的脚本,它们最终都应该是相同的。

    如果有需要加载的数据(代码表、查找值等),请编写作为数据库创建过程的一部分加载数据的脚本。

    通过编写所有内容的脚本并将其保存在源代码管理中,可以随时为任何给定的生成级别重新创建数据库结构。

        2
  •  4
  •   Brett McCann    17 年前

    你应该有两个。为了保持它们同步,您应该始终创建用于创建数据库对象的DDL。像对待PHP代码一样对待这些脚本-将它们保存在版本控制中。任何时候需要修改测试数据库时,都可以编写一个脚本,然后将其签入。然后,您可以在准备好后将这些更改提交到生产系统。

        3
  •  2
  •   Jonas Kongslund    17 年前

    作为每个开发工作站和生产工作站的至少一个数据库。除此之外,您应该为测试环境准备一个测试环境,除非您只是一个开发人员,并且具有与生产环境相似的设置。

        4
  •  1
  •   Community Mohan Dere    9 年前

    How do you version your database schema?

    这是一个常见的问题,已经被问过很多次了。

    Thomas Owens:复制不能用于模式的版本控制-它用于复制数据。您永远不想从dev复制到production,或者从production复制到production。

        5
  •  0
  •   John MacIntyre    17 年前

    一旦我部署了数据库,对开发数据库所做的任何更改都将在一个SQL脚本(不是工具)中完成,脚本将被保存并编号。

    deploy.001.description.sql
    deploy.002.description.sql
    deploy.003.description.sql
    ... etc..
    

    然后在部署时按顺序运行这些脚本。

    然后我把它们归档到一个叫做

    \deploy.YYMMDD\
    

    如果我犯了一个错误,我永远不会返回到以前的部署脚本,我将创建一个新脚本并在其中放置我的修复程序。

    祝你好运

        6
  •  0
  •   Zak    17 年前

    如果您的生产数据不在开发人员的机器上,那么这是另一个问题。在这种情况下,你可以做的一件事是建立一个跟踪虚拟机。运行从主数据库到跟踪虚拟机的复制。当您需要在生产数据库上运行一些更改时,首先停止从属服务器并保存快照。

    启动该快照的实例,将其完全从从属模式中取出,应用更改,并将QA框指向该数据库。如果按预期工作,则可以对主生产数据库运行修补程序。如果没有,请调出快照,并再次将其从主机复制,直到准备好重复更新测试为止。

        7
  •  0
  •   JW.    14 年前

    我也有同样的困境。我一直认为 production db development db . 一、 他们是一枚硬币的两面,两人永远不会相遇。

    或者 生产数据库 开发数据库 ". 相反,我的应用程序使用 local db .

    当它在我的虚拟(dev)计算机上运行时,本地数据库碰巧是 dev db . 不过,我的应用程序并不真的“知道”。

    所以,在主要部分,问题消失了。

    但有时我希望使用实时数据运行测试,或者将数据从代码移动到实时生产数据库中,并快速查看结果。

    这时我添加了 live-read-only db connection

    默认情况下,我的应用程序使用 本地数据库 在一些非常特殊的条件下(在测试套件中),它还使用 live-readonly db

    与其问这个问题 开发数据库 或者 生产数据库 本地数据库 live-read-only db ".

    显然,我的处境可能与你不同,但我发现这一“理解上的突破”对我最有帮助。