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

开发人员的元数据要求

  •  3
  • PaulJ  · 技术社区  · 14 年前

    我的任务是提供我们的数据仓库开发人员可能需要的元数据需求列表。

    这不是业务元数据(漂亮的描述等),而是变更管理(也称为影响评估)、数据沿袭等所需的数据。

    我看过这篇文章 Meta Meta Data Data - Ralph Kimball 但由于我不是第一个这么做的人,所以我要把它扔给SO社区。

    实际问题是: 数据仓库开发人员需要哪些元数据来设计、开发和管理etl例程中的更改?

    注:我试图保持答案平台的不可知性,但对于上下文,这是一个带有pl/sql和datastage的oracle数据库。

    2 回复  |  直到 14 年前
        1
  •  3
  •   AaronLS    14 年前

    在最基本的级别上,您可以维护从源系统中提取的tablename.fieldname的列表。如果是从文件或其他非数据库源中提取,则可能无法列出与字段级别一样细粒度的依赖项。这样的元数据只会告诉您如果(源字段/文件格式/表更改)那么(某些更改 可以 在ETL过程中需要)。我说 可以 因为有些更改可能很小,以致etl过程没有被破坏,但是仍然应该执行测试和数据分析,以确保它不会使etl过程初始设计期间的任何假设失效。

    虽然etl开发人员可能非常熟悉源系统和etl过程,但对于大型etl项目,最好将源系统中的每个依赖项与etl系统的特定过程/组件联系起来。例如,如果etl进程由许多存储过程组成,则需要元数据将每个源系统字段/fileformat/table/etc与每个存储过程关联起来。这将是一种多对多关系,因为许多存储过程可能依赖于特定字段,而单个存储过程可能依赖于许多源字段。这将是由etl开发人员手动更新的,当他们创建或更新etl系统时,他们将负责识别他们正在加载/清理/一致的字段,然后将这些信息输入到跟踪这些依赖关系的元数据中。

    如果您的etl系统是由存储过程之外的其他东西驱动的,或者是它们的某种组合,那么您需要想出一些命名方案来引用这些组件。但概念是相同的,您将源字段/文件格式等与etl系统的组件关联起来。

    这将为您提供足够的信息,说明“person.firstname”在源系统中以某种方式发生更改的位置,然后您可以编译一个报告,其中显示需要验证、潜在更新和测试的所有存储过程,以处理源系统中的更改。

    这意味着,知道person.firstname以某种方式(大小、数据类型和/或完全删除)发生了更改,需要一个手动步骤,即通过某个数据库设计器通知更改,并采取相应的操作。如果您想要一个真正复杂的系统,那么您需要对ddl使用触发器/审计来更改您的源系统,以便您可以自动记录并将更改通知etl架构师。

    如果发生这种更改,您将知道sp_person_load、sp_person_clean、sp_person_transform存储过程都与person.firstname字段有一些关联,因为这些存储过程的作者在元数据文档依赖项中注意到了这一点。

    你可以让它变得更复杂,其中sp_person_clean不依赖于person.firstname,而是依赖于sp_person_load。这样你就建立了一个依赖链。这将使更改报告更加复杂,因为您必须将依赖项链接在一起以确定源系统更改的影响。而且您还构建了一个复杂的依赖项字符串和潜在的循环引用,这可能会使维护元数据和维护etl过程本身一样困难。如果etl系统足够简单,etl架构师可以根据源系统中的字段/文件/表定义依赖项,那么这样做可以使事情保持简单。

    根据谁有权管理您的数据仓库、目标系统,您可能需要跟踪这些依赖项。通常etl开发人员也是数据仓库开发人员。但是,如果其他人是数据仓库设计器,并且他们有权对数据仓库进行更改,那么您的etl开发人员将需要一个类似的系统,无论是自动的还是手动的,来跟踪和通知更改及其对etl pr的影响。奥克斯。

    真的,当我想到应该如何跟踪变化时,我想到了权力的界限。如果etl开发人员更改了sp_person_clean过程,则不需要emtadata告诉他sp_person_transform将需要更新/测试。他已经很直观地知道了这一点。另一方面,如果第三方/供应商系统更改,或者同一组织内的业务部门更改电子表格或文件格式,则这些都不是etl开发人员制定的。他不会像对待自己的etl系统和数据仓库那样,与源系统有同样程度的亲密关系。因此,他将从元数据中受益匪浅,元数据显示了源系统的组件如何与etl系统的组件相关。

    决定您想要定义“组件”的粒度实际上取决于系统的设计方式,以及您希望开发人员记录多少元数据。太细了,就会淹没在元数据中。当然,这就像说“我的房子在佛罗里达”,这并不能真正帮助etl开发人员的工作。如果整个etl过程是在一个sql脚本中编码的,那么您只有一个组件。因此,系统需要预先设计,知道您需要能够引用etl过程的特定组件和/或步骤。

    只有当开发人员努力更新元数据时,元数据才是好的。有一些系统/工具包可以自动更新此类元数据,但它们必须将您放入它们的工具包中,以便该工具可以分析依赖关系。我不太相信这些系统是非常可靠的。有时候,你必须做一些真正的黑客操作,才能以所需的格式将数据从源系统获取到目的地,我可以想象依赖项分析器无法理解依赖项。例如,如果您使用的是由字符串构成的动态sql,那么工具箱就无法真正找出依赖关系是什么。

    不过,我要说的是,我从来没有深入研究过这些工具,以真正了解它们有多好。我一直认为,我发现在sql中通常很容易的事情在这个工具中非常麻烦,并认为这比它的价值更麻烦。我一直告诉自己,我会选择像塔伦德这样的东西,并真正成为一个专家,在我作出最后的决定之前,但总是有其他优先事项把我拉向其他方向。

        2
  •  4
  •   questzen    14 年前

    在我的工作场所,我们有自制etl。我可以看到你扬起眉头:)。我们描述的最小元数据如下。订阅详细信息、审核、数据映射、运行顺序。

    这个 订阅详细信息 再次分为两类:购买数据的供应商和使用数据的团队/应用程序。还存储ftp/http详细信息、访问凭据。幸运的是,我们被要求拥有绝对零的sps,主要的例外是“身份生成器”。

    审核详细信息 包括,数据日期,上次修改时间,运行它的用户,失败/成功计数。

    数据映射表 描述保存数据的表和列名。我们以前有一个额外的组合键描述符表。不过,我们决定不再那样做了。通过要求数据表所有者创建适当的分区策略来补偿性能损失。

    运行顺序表 是另一个表,用于确定用户是否可以运行(y/n)以及运行的顺序。

    元数据还与历史记录(基于日期)一起存储。因此,如果有人决定运行存档/历史订阅。跑步会继续的。

    上述用途 :我们可以根据订阅的重要性来确定数据加载的优先级。我们可以在一般级别(鸟瞰图)监控故障。我们可以编写能够创建动态sql查询的通用代码(无硬编码)。我们的加载和提取过程被迫使用数据映射表,因此任何用户都无法摆脱陈旧的信息。

    从我们的经验来看,这似乎是有效的。