简介
如果一个项目有多个开发人员参与,那么跟上开发数据库的变化可能具有挑战性。在整个开发团队中同步这些更改可能既繁琐又耗时。当不同的团队成员在数据库模式上工作,或者使用的开发数据库数据不能反映最新状态时,可能会导致挫败感,并导致可能最终进入生产环境的错误。
特别是,这些问题可能出现在以下情况中:
- 开发人员正在处理不同迭代的数据库模式
- 开发数据库中的数据不能反映模式的当前状态
在本指南中,我们将探讨团队如何使他们的数据库模式和开发数据在团队之间保持最新和同步。
入职时设置开发数据库
在数据库模式和开发数据的更改可以在团队成员之间共享之前,这些团队成员需要通过一些初始数据库状态进行引导。对于大多数团队来说,这是他们开始处理项目时入职过程的一部分。这个过程的复杂程度主要取决于组织的规模、成熟度及其需求。
大多数新入职开发人员的起点是本地克隆并安装项目。接下来,他们通常需要连接到开发数据库。新开发人员设置开发数据库的两种最常见方式是:
- 运行脚本以填充本地开发数据库
- 连接到共享的远程开发数据库
这两种方法都有其自身的优缺点。
填充本地数据库
填充本地数据库是有益的,因为它省去了运行远程开发数据库的需要。开发人员在开始时可以对进入其开发数据库的数据拥有更多控制权。他们还可以比使用共享远程数据库时更容易重置数据库。
如果采用这种方法,则需要额外努力使填充数据和逻辑与当前模式保持最新。如果更改频繁发生,这可能带来挑战,并可能导致开发人员无法顺利入职的问题。
如果您正在使用Prisma Client,您可以使用集成填充功能轻松填充数据库。
连接到共享的远程数据库
让开发人员连接到共享的远程开发数据库可以减轻在本地填充新开发人员数据库的负担。这很有帮助,因为它使初始入职更容易,允许开发人员更快地提高生产力。使用共享远程数据库也可能是有益的,因为数据库的更改可以由单个开发人员定期迁移,然后这些更改可以被所有团队成员使用。
使用共享远程开发数据库的缺点是它需要额外资源运行,可能产生额外成本。此外,如果所有开发人员都在同一个数据库上工作,很容易覆盖数据。另一个潜在问题是,如果团队成员异步采用模式更改,带外更改可能会对数据状态产生负面影响,使其难以操作。
持续的数据库更新
无论是本地还是远程,一旦开发人员设置好要使用的数据库,他们就需要持续检查数据库模式的更新以及数据库本身中可能存在的数据。如果团队规模庞大且频繁进行更改,这可能很困难。
没有一种万能的方法可以使团队成员了解模式更改。适合您团队的方法取决于具体情况。
以下列表包含一些可以组合使用的方法,以构建您的整体策略,从而使您的团队之间的数据和模式更改保持同步。
使用迁移
在团队环境中处理关系型数据库时,将迁移作为数据库模式更改策略的起点至关重要。
数据库迁移是一组通过自动化可以改变数据库结构的人工制品。最简单地说,迁移是一个SQL文件,其中包含应用模式更改所需的语句。例如,向数据库模型添加字段可能会生成以下SQL文件:
ALTER TABLE User ADD bio varchar(255);
虽然这个命令可以在单个开发人员的本地开发环境中自行运行,但将其作为数据库迁移文件存在,允许团队中的所有其他开发人员通过自动化应用完全相同的更改。
具体的数据库迁移策略因语言和框架而异。然而,通常它们遵循类似的模式:
- 修改描述数据库模型的代码
- 生成一组迁移文件
- 运行迁移以执行语句并使更改生效
Prisma Migrate使得描述数据库模型并从中生成迁移变得容易。它提供了一种非常简单的方法来保持团队成员之间的数据同步。
通知团队成员更改
使用数据库迁移作为更改策略将有助于保持团队成员之间的数据库结构更改同步。然而,通知开发人员这些更改可能具有挑战性。
当两个或更多团队成员正在处理数据库模式的相同部分或使用给定模式部分的应用程序部分时,这成为一个问题。这种情况很可能产生合并冲突并导致挫败感。
虽然这种情况最好通过改进团队沟通来解决,但技术在一定程度上也可以提供帮助。
Git 钩子可用于在不同时间通知开发人员模式更改。例如,可以使用钩子检查已合并并应用于上游的模式更改,然后才允许开发人员推送其更改。这有助于缓解合并冲突并使团队更加同步。
可以使用git-migration-hook作为起点,将此行为脚本化并应用于您团队的特定场景。
自动化数据同步
当数据库模式发生变化时,整个团队可能需要重新填充数据库,以使其中的数据符合新模式。维护填充脚本、分发它并让团队中的每个人持续应用它可能会很繁琐。
自动化此过程的一种选择是使用提供数据库之间双向数据同步的服务。虽然此类服务通常用于出于各种目的同步远程生产数据库,但它也可以用于在团队之间同步开发数据。这样做允许团队使用他们自己的本地或远程开发数据库,这些数据库会持续更新。此类服务的一个示例是Azure 的 SQL 数据同步。
结论
在团队成员之间保持开发数据库更改同步可能是一项具有挑战性的任务。当团队快速行动并协作处理相同的模式时,发生冲突的机会比比皆是。
通过引入包含 Git 钩子和其他工具的工作流以提供自动化,团队可以更容易地保持模式更改和数据同步。
