拆分代码库

本文档介绍了拆分 Dataform 代码库和管理跨代码库依赖项的策略。

仓库是 Dataform 中的核心单元。代码库存储构成 SQL 工作流的所有 SQLX 和 JavaScript 文件,以及 Dataform 配置文件和软件包。您可以将 SQL 工作流存储在单个代码库中,也可以在多个代码库之间拆分 SQL 工作流。

在 Dataform 中拆分代码库具有以下优势:

  • 遵守 Dataform 对编译资源使用量的限制。 将大型 SQL 工作流拆分为多个较小的代码库,可以降低超出 Dataform 编译资源限制的风险。
  • 精细化流程。您可以为 SQL 工作流的每个分块片段及其开发团队单独设置流程(例如持续集成 [CI] 规则)。
  • 细化权限。您可以为 SQL 工作流的每个分块以及开发该分块的团队分别设置权限,以增强 SQL 工作流的整体安全性。
  • 通过尽可能减少在 SQL 工作流的每个分屏 fragment 上工作的协作者数量,从而改进协作。
  • 提高了代码库的可读性。将构成大型 SQL 工作流的文件拆分到多个代码库中,比一次浏览整个 SQL 工作流更容易单独浏览每个代码库。
  • 与执行整个 SQL 工作流相比,加快 SQL 工作流的每个分块片段的工作流执行速度。

在 Dataform 中拆分代码库会带来以下缺点:

  • 每个 Dataform 代码库及其对应的 Git 代码库所需的自定义持续集成/持续开发 (CI/CD) 配置。
  • 每个 Dataform 代码库及其对应的 Git 代码库所需的自定义安排配置。
  • 难以管理存储在多个代码库中的工作流对象之间的依赖项。
  • 缺少对分布在多个代码库之间的 SQL 工作流的全面有向无环图 (DAG) 可视化。在每个代码库中,生成的 DAG 仅代表完整 SQL 工作流的一部分。

拆分代码库的策略

拆分代码库时,您需要将构成父 SQL 工作流的文件划分为存储在 Dataform 单独代码库中的较小的子 SQL 工作流。

您可以选择通过以下任一方式拆分代码库:

  • 每个开发团队 1 个代码库。
  • 每个领域(例如销售、营销或物流)1 个代码库。
  • 每个网域 1 个中央代码库和 1 个存储库,该存储库使用中央代码库的内容作为数据源。

如需将父级 SQL 工作流存储在第三方 Git 托管平台中,您需要将包含子工作流的每个单独代码库分别连接到专用的第三方 Git 代码库。

管理跨仓库依赖项

拆分代码库的最有效方法是将父级 SQL 工作流划分为自包含的子级 SQL 工作流,从而创建独立的代码库。独立仓库不会将其他仓库的内容用作数据源。这种方法不需要管理跨仓库依赖项。

如果无法避免跨仓库依赖项,您可以通过将仓库拆分为一系列仓库来管理它们,其中一个仓库依赖于其前身,并是其后继仓库的数据源。存储库及其依赖项的继承必须最能反映父级 SQL 工作流的结构。

您可以使用 Dataform 数据源声明在仓库之间创建依赖项。您可以将其他 Dataform 仓库中的 BigQuery 表类型声明为当前所编辑仓库中的数据源。声明数据源后,您可以像引用任何其他 Dataform SQL 工作流对象一样引用它,并使用它来开发 SQL 工作流。

当您安排在具有跨仓库依赖项的仓库之间拆分 SQL 工作流的执行时,您必须按照跨仓库依赖项的顺序逐个执行这些仓库。

我们建议避免将代码库拆分为包含双向依赖项的一组代码库。当某个仓库是另一个仓库的数据源,同时也使用该仓库作为数据源时,就会出现仓库之间的双向依赖关系。存储库之间的双向依赖关系会使父 SQL 工作流的调度和执行以及开发流程变得复杂。

后续步骤