拆分代码库

本文档讨论拆分 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 个代码库。

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

管理跨代码库依赖项

拆分代码库的最有效方法是将父 SQL 工作流划分为独立的子 SQL 工作流,以创建独立的代码库。独立代码库不会使用其他代码库的内容作为数据源。此方法不需要管理跨代码库依赖项。

如果您无法避免跨代码库依赖项,则可以通过将代码库拆分为一系列代码库来管理这些代码库,其中代码库依赖于其前身,并且是其后代的数据源。连续的代码库及其依赖项必须最好地反映父级 SQL 工作流的结构。

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

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

我们建议避免将代码库拆分为一组具有双向依赖项的代码库。如果仓库是其他仓库的数据源,并且该仓库也用作数据源,则仓库之间会出现双向依赖关系。代码库之间的双向依赖关系会使父 SQL 工作流的调度和执行以及开发过程变得复杂。

后续步骤