Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 在开发过程中如何管理数据库?_Database_Version Control_Data Integrity_Data Integration - Fatal编程技术网

Database 在开发过程中如何管理数据库?

Database 在开发过程中如何管理数据库?,database,version-control,data-integrity,data-integration,Database,Version Control,Data Integrity,Data Integration,我的四人开发团队已经面临这个问题一段时间了: 有时我们需要处理同一组数据。因此,当我们在本地计算机上开发时,dev数据库是远程连接的 然而,有时我们需要在数据库上运行操作,这些操作将占用其他开发人员的数据,即我们中断关联。对于这一点,本地数据库将是很好的 有没有一个最佳实践来摆脱这个困境?是否有类似于“SCM for data”的工具 奇怪的是,在git repo中保存一个SQL insert/delete/update查询的文本文件是很有用的,但我认为这可能会很快变得很慢 你们是怎么处理的?在

我的四人开发团队已经面临这个问题一段时间了:

有时我们需要处理同一组数据。因此,当我们在本地计算机上开发时,dev数据库是远程连接的

然而,有时我们需要在数据库上运行操作,这些操作将占用其他开发人员的数据,即我们中断关联。对于这一点,本地数据库将是很好的

有没有一个最佳实践来摆脱这个困境?是否有类似于“SCM for data”的工具

奇怪的是,在git repo中保存一个SQL insert/delete/update查询的文本文件是很有用的,但我认为这可能会很快变得很慢


你们是怎么处理的?

在过去,我已经用几种方法处理过了

一个是创建和填充数据库的SQL脚本存储库。这是一个不错的选择,可以保持一切同步(即使您不使用此方法,也应该维护这些脚本,以便您的数据库处于源代码控制中)


另一个(我更喜欢)是在服务器上有一个无人连接的“干净”dev数据库的单一实例。当开发人员需要刷新他们的dev数据库时,他们会运行一个SSIS包,将“干净”数据库复制到他们的dev副本上。然后,我们可以根据需要修改我们的开发人员数据库,而无需依赖其他开发人员。

我们有一个数据库维护工具,可用于创建/更新表和过程。我们有一个服务器,它有一个填充了数据的最新数据库

我们保留本地数据库,可以根据自己的选择使用,但当我们需要返回“基线”时,我们会从服务器获取“主数据库”的备份,并在本地进行恢复

如果/当我们添加列/表/过程时,我们将更新保存在源代码管理中的dbMaintenance工具


有时,这很痛苦,但它工作得相当好。

如果您使用诸如nHibernate之类的ORM,请创建一个脚本,在开发人员的本地开发数据库中生成模式和数据

在开发过程中改进该脚本以包含典型数据

部署前在临时数据库上进行测试

我们为最终用户将生产数据库复制到UAT数据库。开发人员无法访问该数据库

删除所有表、再次创建它们并注入测试数据只需不到几秒钟的时间


如果您使用的是生成模式的ORM,则不必维护创建脚本。

我们使用本地开发人员数据库和单个主数据库进行集成测试。我们在SCM中存储创建脚本。一名开发人员负责根据“golden master”模式更新SQL脚本。开发人员可以根据需要对其本地数据库进行更改,根据需要从integration DB中的数据填充,使用导入过程,或使用工具生成数据(在我们的示例中为红门数据生成器)。如有必要,开发人员将清除其本地副本,并可以根据需要从创建脚本和集成数据中刷新。通常情况下,数据库只用于集成测试,我们将其模拟出来用于单元测试,这样可以最大限度地减少保持同步的工作量。

您可能会发现我的问题很有用

从根本上讲,有效管理共享资源(如数据库)很难。这很难,因为它需要平衡多人的需求,包括其他开发人员、测试人员、项目经理等

通常,为单个开发人员提供他们自己的沙盒环境更有效,他们可以在其中执行开发和单元测试,而不会影响其他开发人员或测试人员。但这并不是万灵药,因为您现在必须提供一种机制,使这些多个独立的环境随着时间的推移彼此保持同步。您需要确保开发人员有一种合理的方式来获取彼此的更改(数据、模式和代码)。这并不一定容易。一个好的供应链管理实践可能会有所帮助,但它仍然需要相当程度的合作和协调才能实现。不仅如此,而且为每个开发人员提供他们自己的整个环境的副本可能会带来存储成本和额外的DBA资源,以帮助管理和监督这些环境

以下是一些供您考虑的想法:

  • 创建一个共享的、公共的“环境白板”(可以是电子版),开发人员可以方便地看到哪些环境可用以及谁在使用它们
  • 确定拥有数据库资源的个人或组。他们负责跟踪环境,并帮助解决不同群体(开发人员、测试人员等)的冲突需求
  • 如果时间和预算允许,考虑为所有开发人员创建沙箱环境。 <> LI>如果您还没有这样做,请考虑从“集成”、“测试”和“验收测试”环境中分离开发人员“游戏区”。李>
  • 确保对关键数据库对象进行版本控制,尤其是那些经常更改的对象,如触发器、存储过程和视图。如果有人覆盖了其他人的更改,您不希望丢失工作

  • 在此之前,我开发了一个与数据仓库相关的产品,如果需要,可以安装在客户机站点上。因此,软件知道如何进行“安装”(主要是创建所需的数据库模式和静态数据,如货币/国家代码等)

    因为我们在代码本身中有这些信息,并且因为我们有可插拔的SQL适配器,所以让这些代码与内存中的数据库(我们使用HSQL)一起工作很简单。因此,我们对“真正的”本地服务器(Oracle或SQL Server)进行了大部分实际开发工作和性能测试,但所有的单元测试都是
    git submodule init
    git submodule update
    
    rake dev_db:update ......... (or something like that!)