小林开了一家叫“数据小馆”的融合菜餐厅,招牌菜是“信息红烧肉”。开业不久,一位顾客吃完后严重过敏进了医院。市场监管上门调查,小林不慌不忙打开平板上的“食材溯源系统”,输入菜名,屏幕瞬间展开一张链路图:花生酱→清洗厨房→聚合炒锅→出餐台→顾客餐桌,每个环节的供应商、入库时间、操作人清清楚楚。十分钟,问题定位——是那批花生酱在“数据农场”供应商仓库里被交叉污染了。 这套“食材履历台账”就是数据血缘(Data Lineage),而“过敏原审查”就是隐私影响评估(PIA)。在AI与数据的世界里,每份数据都像一袋食材:身份证号是“花生”,手机号是“海鲜”,家庭住址是“乳制品”。数据从数据库产生,经过ETL加工,流入数据仓库,最终被报表和应用消费——这个过程就是血缘。PIA则像餐厅的食品安全审查:查清哪些“过敏原”藏在菜品里,评估它们被端上顾客餐桌(数据出境、共享)之前有没有风险。数据血缘与PIA,本质上是一套“从菜园到餐桌”的溯源与质检体系。本文将从这家餐厅出发,带小白读者看懂数据血缘如何为隐私保护筑基。

岗位关联

学会数据血缘与PIA的联动,你就能从“只会写模型”升级为“能讲清数据合规”的复合型AI工程师——在数据跨境、隐私计算等场景中,这是企业当下最稀缺的能力。

目录
  1. 可视化演示
  2. 血缘概念定义:食材履历台账
  3. 血缘图谱逻辑:厨房流水线关系图
  4. 血缘采集技术:菜谱、观察员与收据
  5. 隐私敏感识别:过敏原清单
  6. PIA评估映射:食品安全审查
  7. 工程化落地:从台账到质检体系
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

三步展示数据血缘全生命周期:有向图谱构建与字段级传播链路、敏感字段跨变换追踪、血缘驱动PIA自动化映射与合规风险评估。

本节配有交互动效(进入视口后自动加载,约 3KB)。

数据血缘有向图谱构建 源表SRC经ETL加工流向临时表TMP和数据仓库DW 边上标注变换语义:CP复制、HSH哈希、JN关联 Lineage = (V_tables, E_transforms, T_semantics) 有向图建模数据全生命周期流转路径。

血缘概念定义:食材履历台账

小林做的第一件事,是建“食材履历台账”。每道菜一张卡,正面写菜名和成品,背面写配料清单、每样配料的供应商和进货批次。没有这张卡,顾客过敏时只能满厨房翻垃圾桶;有了它,一查卡片,十秒定位是哪个环节混入了花生。

数据血缘就是这个台账。数据血缘(Data Lineage)记录一份数据从产生、流转、加工到消费的全生命周期路径,精确回答三个问题:这数据从哪张表来?经过了哪些ETL任务?被哪些下游报表和应用消费?它和数据目录不同:数据目录是“冰箱里有什么”的静态清单,血缘是“这道菜怎么一步步做出来”的动态链路。

血缘还分表级与字段级。表级血缘回答“订单宽表依赖订单明细表”;字段级血缘更细,能回答“报表里的 order_amount 字段来自订单表的 amount 字段,而不是手输的常量”。隐私评估必须用字段级血缘——过敏原要精确到“哪一根花生”,而不是“某个花生加工厂”。此外,血缘有生命周期:新任务上线时采集,任务变更时更新,任务下线时失效,需要持续维护而非一劳永逸。

台账给餐厅带来的第一个好处,是“可回答”。当卫生局问“这盘菜含不含花生”时,后厨能翻出卡片给出确定的答案。同样,当合规审计问“这个报表里的身份证号到底来自哪里”时,血缘图谱是唯一能给出完整路径的答案——这就是隐私评估的起点。

血缘图谱逻辑:厨房流水线关系图

台账卡片多了之后,小林把它们拼成了一张“厨房流水线关系图”:进货验收台→冷藏库→粗加工台→烹饪灶台→出餐口,每个环节是图上的一个点,食材流动的方向是箭头。这张图从“进货端”往“出餐端”看,能知道一批牛肉最后做成了哪些菜;从“出餐端”往回看,能知道一道菜用了哪些食材。

血缘图谱也是同样的结构。它是一个有向图:节点是数据实体(表、字段、调度任务),边是流转关系。顺着边往下游走,是“下游影响分析”——如果我要改上游某个字段的类型,会波及多少报表?逆着边往上游走,是“上游溯源”——这个报表字段的完整来路是什么?

用图论语言定义一个血缘图谱:

血缘图谱 G=(V,E),V={表,字段,调度任务},E={(u,v,op)∣u 流转至 v}\text{血缘图谱 } G = (V, E), \quad V = \{ \text{表}, \text{字段}, \text{调度任务} \}, \quad E = \{ (u, v, \text{op}) \mid u \text{ 流转至 } v \}

1. 图的二元组定义:血缘图谱由节点与边两个集合组成,节点表示数据实体,边表示流转关系,就像流水线图的工位与传送带。

G=(V,E)G = (V, E)

2. 节点清单:节点可以是数据库表、字段或调度任务,相当于流水线上每个工位都有各自的职责。

V={表,字段,调度任务}V = \{ \text{表}, \text{字段}, \text{调度任务} \}

3. 边清单:每条边记录数据从上游 u 流向下游 v,并附加转换操作 op,相当于食材从 A 工位送到 B 工位时经过了切割或烹饪。

E={(u,v,op)∣u 流转至 v}E = \{ (u, v, \text{op}) \mid u \text{ 流转至 } v \}

有了这张流水线图,最值钱的能力是“全链路视角”——隐私评估要的不是“这个字段存在”,而是“它从源头一路走到哪些出口”。从源头出发的所有箭头,就是敏感信息传播的潜在路径。每一段路径,都可能成为数据泄露的“交叉污染点”。

血缘采集技术:菜谱、观察员与收据

台账上的流转关系不会凭空出现。小林用了四种方式采集。第一种是“翻菜谱”:每道菜的标准配方表(SQL脚本)是现成的,直接解析配方表就能知道食材依赖关系。第二种是“请观察员”:在灶台旁装摄像头和传感器,记录厨师实际动过的食材(动态抓取)。第三种是“翻收据和垃圾桶”:从采购单和厨余垃圾推测实际用料(日志分析)。第四种是“看排班表”:厨师之间的交接班次(调度依赖)能反映工序先后。

血缘采集也是这四类。静态 SQL 解析:解析 ETL、BI 工具里的 SQL 语句,从语法树抽取表和字段映射,覆盖广、成本低,但前提是“菜谱说的”与“实际做的”一致。动态运行抓取:在数据平台埋点,捕获真实运行时的 SQL 执行计划和数据流转,准确但只覆盖跑过的任务。日志采集分析:从任务日志提取输入输出路径,适合补充黑盒系统。调度依赖解析:从 DAG 调度器读取任务上下游,确定血缘关系的时间先后。

判断血缘采集是否到位,常用“覆盖率”这个指标:

Coverage=CapturedEdgesTotalEdges\text{Coverage} = \displaystyle \frac{\text{CapturedEdges}}{\text{TotalEdges}}

1. 分子·已捕获边数:CapturedEdges 是台账上已经登记到的血缘边数量,等于已采集到的“食材流转记录”条数。

CapturedEdges=#{e∈E∣已采集}\text{CapturedEdges} = \#\{ e \in E \mid \text{已采集} \}

2. 分母·实际总边数:TotalEdges 是系统中应当存在的血缘边总数,由 SQL 脚本、调度任务、日志共同推算,相当于厨房里实际发生的全部食材流转。

TotalEdges=#{e∈E∣实际存在}\text{TotalEdges} = \#\{ e \in E \mid \text{实际存在} \}

3. 覆盖率比值:分子与分母之比反映血缘图谱的完整度,覆盖率越高,后续 PIA 评估的结论越可信。

Coverage=CapturedEdgesTotalEdges∈[0,1]\text{Coverage} = \frac{\text{CapturedEdges}}{\text{TotalEdges}} \in [0, 1]

四种采集方式就像“菜谱+观察员+收据+排班表”的组合。小林发现,光看菜谱会漏掉厨师临场发挥,光看实操会漏掉没做过的菜——只有融合多种信号,台账才真正可信。血缘采集亦然:动态为主、静态兜底、日志与调度互补,是工程上的主流策略。

隐私敏感识别:过敏原清单

台账建好了,但小林还不能松口气。因为他发现,流水线图上每道菜都有几十种食材,其中只有少数是“过敏原”——花生、海鲜、麸质。他专门做了一份“过敏原清单”,给每种食材打上标记:花生=高风险,酱油(含麸质)=中风险,青菜=无风险。这样,从台账里一眼就能看出哪些菜“带雷”。

数据世界同样需要一份“敏感字段清单”。身份证号、手机号、家庭住址、银行卡号属于高风险“过敏原”;姓名、生日属于中风险“间接标识符”;城市、性别单独看无害,但组合起来也可能指向特定个人。识别方法有三种:正则匹配(身份证号 18 位数字+校验位)、关键词与词典匹配(字段名含“phone“或”手机”)、机器学习分类(训练字段名和样本数据自动分型)。

光靠字段名识别还不够,还需要“指纹扫描”:对存量数据做采样抽查,用正则和数据画像确认字段里真的存了敏感内容,而不是“名为 phone 却被拿来存备注”。扫描完成后,给血缘图的每个敏感节点标红,形成“脱敏传播标记”。这时可以用“暴露面”公式量化某个字段的隐私风险:

Exposure(f)=∑d∈Down(f)1sensitive(d)⋅1dist(f,d)\text{Exposure}(f) = \displaystyle \sum_{d \in \text{Down}(f)} \mathbb{1}_{\text{sensitive}}(d) \cdot \frac{1}{\text{dist}(f, d)}

1. 下游节点集合:Down(f) 是从字段 f 出发沿血缘图能到达的所有下游节点,相当于一道菜被端到过的所有餐桌。

Down(f)={d∣f⇝d}\text{Down}(f) = \{ d \mid f \rightsquigarrow d \}

2. 敏感指示函数:当节点 d 是敏感字段时取 1,否则取 0,相当于“这张餐桌是否接待过花生过敏者”。

1sensitive(d)={1d 敏感0d 普通\mathbb{1}_{\text{sensitive}}(d) = \begin{cases} 1 & d \text{ 敏感} \\ 0 & d \text{ 普通} \end{cases}

3. 距离衰减因子:敏感节点离源头越远,贡献越小,因为中间可能被脱敏或加工稀释,相当于花生酱被稀释成“可能含微量花生”的调味汁。

1dist(f,d)\frac{1}{\text{dist}(f, d)}

4. 累加求和:逐节点累加“敏感程度×距离权值”,得到字段 f 的暴露面,数值越大表示敏感信息传播越广、越难收敛。

Exposure(f)=∑d∈Down(f)1sensitive(d)⋅1dist(f,d)\text{Exposure}(f) = \sum_{d \in \text{Down}(f)} \mathbb{1}_{\text{sensitive}}(d) \cdot \frac{1}{\text{dist}(f, d)}

有了过敏原清单和暴露面计算,小林第一次能回答“哪道菜最危险”:不是含花生最多的那道,而是“花生被分散到多个配菜、每个配菜又各自上桌”的那道。数据隐私也是一样的道理——最危险的字段,往往是敏感信息被复制到越多下游表里的那一个。

PIA评估映射:食品安全审查

现在,小林的餐厅要推“跨国外卖”,把宫保鸡丁卖到海外。市场监管要求上新前必须做“食品安全审查(PIA)”。审查分四步——识别:这道菜含哪些过敏原?分析:过敏原在制作流程中被用到哪些环节?评价:如果顾客过敏,后果多严重?处置:要标注过敏提示,还是换掉含花生的酱料?

PIA(隐私影响评估)在数据世界完全同理。识别:这条数据链路含哪些敏感字段?分析:敏感字段在血缘图谱中的传播链路有多广?评价:一旦泄露或出境,对个人权益的影响多大?处置:决定是脱敏、加密、限制出境,还是直接拒绝该数据共享任务。

把血缘图谱自动映射到 PIA,需要一个可计算的评分模型:

PIA_Score(f)=α⋅max⁡d∈Down(f)Severity(d)+β⋅Exposure(f)\text{PIA\_Score}(f) = \alpha \cdot \max_{d \in \text{Down}(f)} \text{Severity}(d) + \beta \cdot \text{Exposure}(f)

1. 最敏感节点严重度:取下游所有节点中敏感等级最高者的严重度分数,级别可来自法规定义(如身份证号=高,城市=低)。

max⁡d∈Down(f)Severity(d)\max_{d \in \text{Down}(f)} \text{Severity}(d)

2. 暴露面:第 4 节计算的 Exposure(f),衡量敏感字段在下游传播的广泛程度。

Exposure(f)\text{Exposure}(f)

3. 加权融合:α 与 β 是业务可调权重,用于权衡“最坏单点”与“整体传播面”各自的影响。

α⋅max⁡Severity+β⋅Exposure\alpha \cdot \max \text{Severity} + \beta \cdot \text{Exposure}

得到评分后,再套用分级阈值做结论:

Decision(f)={通过PIA_Score≤T1评审T1<PIA_Score≤T2拒绝PIA_Score>T2\text{Decision}(f) = \begin{cases} \text{通过} & \text{PIA\_Score} \le T_1 \\ \text{评审} & T_1 < \text{PIA\_Score} \le T_2 \\ \text{拒绝} & \text{PIA\_Score} > T_2 \end{cases}

1. 低分直接通过:评分低于阈值 T1,说明敏感字段几乎没有下游传播,数据操作合规放行。

PIA_Score≤T1⇒通过\text{PIA\_Score} \le T_1 \Rightarrow \text{通过}

2. 中分人工评审:评分落在 T1 与 T2 之间,需要合规人员结合业务场景、用户授权等信息人工判断。

T1<PIA_Score≤T2⇒评审T_1 < \text{PIA\_Score} \le T_2 \Rightarrow \text{评审}

3. 高分强制拒绝:评分高于阈值 T2,说明敏感字段大范围传播且无法收敛,必须阻断该数据流转。

PIA_Score>T2⇒拒绝\text{PIA\_Score} > T_2 \Rightarrow \text{拒绝}

小林把审查规则编进系统,每次跨国外卖新品上架,系统自动翻开食材台账、标出过敏原、算出风险等级。低风险直接上架,中风险转人工审菜单,高风险直接下架。这套“自动映射”正是数据血缘图谱对 PIA 最大的价值——把原来需要合规团队埋首数周的调查,压缩成一次图谱查询。

工程化落地:从台账到质检体系

小林生意越做越大,开了三家分店。他发现,光靠人肉维护台账已经不行了,于是上了一套“中央厨房管理系统”:进货扫码枪自动录入食材批次(血缘自动挂接),库存系统与菜单打通(数据目录集成),顾客扫码就能看到每道菜的溯源码(可视化溯源),新品上架自动触发过敏审查(评估闭环)。

数据血缘的工程化落地同样是这四个模块。首先,血缘采集器要与数据目录集成——目录提供“有哪些表”,血缘补充“表与表怎么流转”,两者合并才是一份完整的数据资产地图。其次,血缘要自动挂接:在 ETL 平台、调度系统、BI 工具中部署采集插件,新任务上线时自动解析并更新图谱,不需要人工画图。

第三,可视化溯源:数据目录产品里提供“血缘视图”,用户点击任意字段,既能看到上游祖先(来源),也能看到下游子孙(去向),过滤条件支持“只看敏感节点”——就像顾客扫码看到菜品的完整溯源信息。第四,评估闭环:将 PIA 评分嵌入数据发布流程,每当有新数据导出、跨境传输或共享任务,系统自动走一遍“血缘定位→敏感识别→风险评分→结论输出”,合规团队只需要处理“评审”级别的任务。

现在,小林的分店管理已经不需要他亲自盯台账——系统在每个环节自动记录,为每道菜生成可溯源的“出生证明”。数据血缘与 PIA 的工程化,最终也是这样一个“自动化质检体系”:让合规能力长在基础设施里,而不是挂在某位合规工程师的脑子上。

AI 应用场景

数据出境合规审查

阶段:隐私合规评估

解决的问题:传统方式靠工程师手动梳理数仓中几十张表的字段关系,耗时数周且容易遗漏。AI+血缘图谱自动定位涉及敏感信息的完整链路,一键生成 PIA 评估材料。

具体案例:某跨国电商平台要将会员行为数据同步至海外数据中心。合规工程师在数据目录中点击“会员宽表.user_id”,血缘图谱自动展开上游 3 层来源与下游 5 个导出任务,识别出 2 条链路包含手机号与设备标识(属于敏感“过敏原”),系统给出 PIA 评分“中风险需评审”,并自动生成合规报告供法务审批。

隐私计算平台联动

阶段:脱敏与隐私计算工程化

解决的问题:脱敏后的字段在复杂流转中可能被“还原”或绕过,人工难以追踪。血缘系统在脱敏节点自动打标,形成“已脱敏”传播标记,任何绕过脱敏的明文访问立刻暴露。

具体案例:数据中台有一张“用户交易宽表”,含手机号、身份证号。脱敏平台对 phone 做 MD5 脱敏后,血缘系统自动记录“脱敏边”。下游分析任务读取脱敏字段,血缘判定“不含明文敏感字段”,PIA 评分低风险自动放行。某天一个临时查询任务直连原表,血缘链路出现“明文突破”红色告警,平台立即阻断并触发 PIA 审查。

数据资产目录血缘视图

阶段:数据资产管理

解决的问题:数据目录只有“静态清单”难以回答数据流转问题。血缘视图让数据资产从“可查询”升级为“可追踪、可评估”。

具体案例:某银行数据团队在数据目录中上线“字段级血缘视图”。分析师点击报表字段“客户总资产”,看到上游来自客户表 balance 字段,经过 3 个 ETL 汇总任务,下游被 8 个报表引用;其中 2 个下游报表用于对外共享,系统自动标记“涉及敏感字段,需 PIA”。最终该功能把数据资产盘点时间从 2 周缩短到 2 天。

Python 演示

python81 行
# -*- coding: utf-8 -*-"""数据血缘追踪与PIA风险评分演示场景: 用户表与订单表经过ETL加工生成用户画像宽表,      再聚合成客户分析报表。系统追溯报表字段的上游血缘,      定位敏感字段并计算PIA风险评分。"""  class FieldNode:    def __init__(self, name, sensitive=False):        self.name = name        self.sensitive = sensitive  class LineageGraph:    def __init__(self):        self.nodes = {}        self.edge_list = []     # (from, to, transform)     def add_node(self, node):        self.nodes[node.name] = node     def add_edge(self, fr, to, transform):        self.edge_list.append((fr, to, transform))     def trace_upstream(self, target):        ancestors = []        visited = set()         def dfs(cur_name):            if cur_name in visited:                return            visited.add(cur_name)            ancestors.append(cur_name)            for fr, to, _ in self.edge_list:                if to == cur_name:                    dfs(fr)         dfs(target)        return ancestors     def pia_assess(self, target, alpha=0.8, beta=0.4, threshold=1.5):        upstream = self.trace_upstream(target)        sensitive_hits = [name for name in upstream                          if self.nodes[name].sensitive]        max_severity = 1.0 if sensitive_hits else 0.0        exposure = len(sensitive_hits)        score = alpha * max_severity + beta * exposure        verdict = "LOW_RISK" if score <= threshold else "NEED_PIA"        return {            "upstream": upstream,            "sensitive_fields": sensitive_hits,            "score": round(score, 2),            "verdict": verdict        }  def build_demo_graph():    g = LineageGraph()    for name in ["user_id", "phone", "city", "order_id", "amount"]:        g.add_node(FieldNode(name, sensitive=(name in ("user_id", "phone"))))    g.add_node(FieldNode("user_dim_id", sensitive=False))    g.add_node(FieldNode("order_fact_id", sensitive=False))    g.add_node(FieldNode("report_user_amount", sensitive=False))     g.add_edge("user_id", "user_dim_id", "etl_clean_user")    g.add_edge("phone", "user_dim_id", "etl_clean_user")    g.add_edge("city", "user_dim_id", "etl_clean_user")    g.add_edge("order_id", "order_fact_id", "etl_clean_order")    g.add_edge("amount", "order_fact_id", "etl_clean_order")    g.add_edge("user_dim_id", "report_user_amount", "etl_join_report")    g.add_edge("order_fact_id", "report_user_amount", "etl_join_report")    return g  if __name__ == "__main__":    graph = build_demo_graph()    result = graph.pia_assess("report_user_amount")    print("上游血缘:", " -> ".join(result["upstream"]))    print("敏感字段:", result["sensitive_fields"])    print("PIA评分:", result["score"], "结论:", result["verdict"])
目的:构建一个小型血缘图谱,演示从报表字段向上游追溯完整链路、识别敏感字段并计算 PIA 风险评分的全过程。
  1. g.add_node(FieldNode(name, sensitive=(name in ("user_id", "phone"))))添加节点时直接标记是否敏感,相当于在过敏原清单上打钩。
  2. g.add_edge("user_id", "user_dim_id", "etl_clean_user")注册一条血缘边,表示 user_id 经清洗任务流入 user_dim_id。
  3. self.edge_list.append((fr, to, transform))用三元组保存一条血缘边,fr 是上游,to 是下游,transform 是加工动作。
  4. if to == cur_name: dfs(fr)递归向上游搜索,找到所有指向当前节点的父节点,像链条一样逐环回溯。
  5. upstream = self.trace_upstream(target)返回完整血缘路径,相当于菜谱的完整溯源列表。
  6. sensitive_hits = [name for name in upstream if self.nodes[name].sensitive]过滤出链路中的敏感字段,只留下“含花生”的记录。
  7. score = alpha * max_severity + beta * exposurePIA 评分:最坏单点严重度×α 加上传播暴露面×β。
  8. verdict = "LOW_RISK" if score <= threshold else "NEED_PIA"阈值判断生成合规结论,低风险放行、高风险触发评估。

常见误区

误区数据血缘和数据目录不都是记录数据信息的吗?有了目录就够了,不用单独做血缘。

正解数据目录是“冰箱里的食材清单”,告诉你“有什么、放在哪、谁负责”;数据血缘是“食材的履历台账”,告诉你“从哪来、经过什么加工、流向哪道菜”。隐私评估需要的是后者——只知道“表里有身份证号”远远不够,还必须知道“这列身份证号被哪些下游任务读走、复制、导出”。

为何常见:两者都展示“数据信息”,界面也常被做进同一个产品里,初学者容易把静态清单与动态链路当成一回事。

误区血缘图画出来了,敏感字段也标红了,是不是就说明我们已经合规了?

正解血缘图谱是 PIA 的“基础设施”,不是“裁判”。它只负责“把链路看清楚”,是否合规还要结合法规(如《个人信息保护法》《数据安全法》)、业务必要性、用户授权范围等。相当于食材溯源台账只能告诉你“花生用在哪”,不能代替食药监局判断“这样用是否合法”。

为何常见:把“工具能力”与“决策判断”混为一谈,觉得数据驱动就可以自动得出合规结论。

误区静态解析只是看代码猜的,动态抓取才是真实发生的,所以只做动态就够了。

正解两者互补而非替代。动态抓取只覆盖“实际运行过”的任务,低频或已停产任务不会被捕获;静态解析覆盖全部脚本,但对实际变更不敏感。工程上常用“动态为主、静态兜底”:动态提供真实链路,静态补齐未运行或历史任务的边。只看任何一者,覆盖率都会明显不足。

为何常见:“眼见为实”的直觉让人低估静态分析在覆盖率和成本上的优势,陷入非此即彼的二元取舍。

误区血缘图谱建好了就不管了,以后每次查询直接用就行。

正解数据流转关系会随任务改造、表结构变更而变化。一个 ETL 任务 SQL 重写了,血缘边就必须更新;一张表下线了,相关血缘节点要标记失效。如果图谱不更新,PIA 会基于过期链路得出错误结论——好比餐厅换了新菜单,却还在用旧台账记录,过敏审查自然失准。

为何常见:把它当作静态文档而不是动态系统,忽略了“台账需要持续维护”这个运维常识。

误区只要数据里没有身份证号、手机号,就不算有敏感字段,也不用做 PIA。

正解敏感识别还要看“间接标识符”与“组合推演”。性别+出生日期+城市组合起来,在人口统计上足以唯一确定到具体个人。这就像单独的“花生碎”和“面粉”都不可怕,但混合做成的花生酱就可能致命。血缘图必须同时标记“直接敏感字段”与“组合敏感字段”,并对“能拼出个人身份”的组合路径评估风险。

为何常见:法规通常先列举“直接标识符”,初学者容易忽略“去标识化数据仍可能重识别”的隐私风险。

面试题

Q1. 数据血缘的核心价值是什么?

单选题 · easy

  • A.美化数据报表样式
  • B.追踪数据流转全链路← 正确答案
  • C.加快数据库查询速度
  • D.压缩数据存储空间

答案:B。数据血缘记录数据从产生、加工到消费的完整路径,核心是“追踪流转”。B 正确;A 是附带可视化效果,C 和 D 分别属于性能优化与存储管理,都与血缘无关。

Q2. 血缘图谱适合用什么图模型表达?

单选题 · easy

  • A.无序集合模型
  • B.完全二叉树模型
  • C.有向无环图模型← 正确答案
  • D.环形链表模型

答案:C。数据流转从源头流向消费端,方向确定且不应成环(否则任务死循环),所以用有向无环图(DAG)。无序集合、二叉树、链表都表达不了“多对多且方向确定”的关系。

Q3. 以下哪项属于静态血缘采集?

单选题 · mid

  • A.解析SQL生成血缘关系← 正确答案
  • B.监听运行时数据流动
  • C.抓取链路网络请求
  • D.分析服务器运行日志

答案:A。静态采集从 SQL 脚本、代码仓库中解析依赖,不需要触发运行。B 和 C 属于动态抓取,D 属于日志分析,都不属于“静态”范畴。

Q4. 哪些方法可用于敏感字段识别?

多选题 · mid

  • A.正则匹配身份证手机号← 正确答案
  • B.关键字与词典匹配← 正确答案
  • C.机器学习分类模型← 正确答案
  • D.随机数生成算法

答案:ABC。正则匹配、词典匹配、机器学习是三类主流敏感字段识别方法。D 的随机数生成与识别毫无关系,属于干扰项。

Q5. PIA评估中,最能说明隐私风险高的信号是?

单选题 · mid

  • A.数据存储使用固态硬盘
  • B.敏感字段被大量下游复制← 正确答案
  • C.报表使用彩色图表展示
  • D.服务器放置在南方机房

答案:B。敏感字段被大量下游复制,意味着传播链路广、暴露面大,PIA 风险高(B)。存储介质、图表样式、机房位置与隐私风险没有直接关系。

Q6. 血缘图谱在PIA中的作用包括哪些?

多选题 · hard

  • A.定位敏感字段传播链路← 正确答案
  • B.识别数据出境合规风险← 正确答案
  • C.替代数据库备份恢复
  • D.提升CPU计算性能

答案:AB。血缘图谱把敏感字段的完整传播路径可视化,并支撑出境链路的风险识别。备份恢复与计算性能属于数据库运维范畴,不是血缘图谱的职责。

Q7. “数据目录”与“数据血缘”的区别是?

单选题 · easy

  • A.血缘是动态链路目录是静态清单← 正确答案
  • B.血缘是数据字典目录是流转路径
  • C.血缘是安全审计目录是性能优化
  • D.血缘是数据存储目录是查询方法

答案:A。数据目录提供静态的元数据清单(“有什么”),数据血缘提供动态的流转链路(“从哪来、到哪去”)。A 正确;B 把两者说反;C、D 分别混淆了血缘与审计、性能、存储等无关概念。

Q8. 动态血缘采集的突出优点是?

单选题 · hard

  • A.能捕获真实运行时数据流转← 正确答案
  • B.无需运行环境实时支持
  • C.可完全替代静态解析法
  • D.适用于所有离线批量文件

答案:A。动态采集在运行环境埋点,记录真实流转路径,所以 A 正确。它恰恰依赖运行环境(B 错);它无法覆盖从未运行的任务,不能完全替代静态解析(C 错);它更适合在线环境而非纯离线文件(D 错)。

Q9. 血缘图谱“下游影响分析”常用于?

多选题 · mid

  • A.评估上游字段修改影响← 正确答案
  • B.追踪敏感数据最终去向← 正确答案
  • C.证明代码无逻辑缺陷
  • D.计算数据库表存储开销

答案:AB。从某节点顺边往下游走,能看到修改它会影响哪些字段与报表(上游修改的影响范围),也能看到敏感数据最终流向哪些出口。代码缺陷检测与存储开销计算都不属于血缘的职责。

Q10. 隐私计算场景下,最推荐的血缘+脱敏做法是?

单选题 · extreme

  • A.对敏感字段脱敏后流转标记← 正确答案
  • B.删除所有敏感信息字段
  • C.将敏感字段改名防识别
  • D.关闭数据库外网端口

答案:A。对敏感字段脱敏(如 MD5)后允许继续在内部流转,并在血缘图谱中打“已脱敏”标记,既保留数据价值又降低风险(A)。B 过于激进会破坏业务;C 只是改名混淆,数据内容仍是明文;D 一刀切关端口在需要内部使用数据的场景下不可行。