本体¶
本体是建立在数据模型之上的一套活的词汇。每个物理列都对应一个术语,含义相同的列共享一个术语,无论它们写法有多不同。每个术语都可以有定义、指向其他术语的类型化关系、一份领域专家名单,以及像 pii 这样的标签,具有该含义的每一列都会带上它。
它是一张由概念、概念的定义以及概念之间关系构成的图。Provisa 把它映射到存放这些值的表和列上,正因如此它才能回答关于你的数据的问题。一个术语在拥有定义并触达数据之前都是草稿。本体与指标相互独立:术语说明一个概念是什么,指标说明一个数字如何计算。
这套共享词汇把业务语言和物理数据连接起来。一个 AI 代理只要知道 "customer" 指代每一个带客户标识符的列,就不必猜测 cust_id、customerId 和 CUSTOMER_KEY 中哪个才是对的。它们都对应同一个术语,而这个术语带着定义。
类、属性与概念¶
每个术语恰好有一个角色,由它锚定的对象推导而来。你永远不需要自己设置。
| 角色 | 锚定于 | 示例 |
|---|---|---|
| 类 | 一张或多张表或视图。它的实例就是这些表的行。 | customer,锚定于 customers 和 crm_contacts |
| 属性 | 不是键的列。 | customer email,持有 customers.email |
| 概念 | 不直接锚定任何对象。它通过自身的关系触达数据。 | revenue,有来自 order amount 和 refund amount 的 PART_OF 边 |
一个术语只能是其中之一。Provisa 会拒绝把表锚定到持有非键列的术语上,也会拒绝把非键列移到锚定于表的术语上。每次拒绝都会说明是哪个术语以及它已持有什么。
每张有键的表都会提议一个类¶
保存一张带主键的表时,Provisa 会把它锚定到一个处于草稿状态的类术语上,该术语以表的概念命名:orders 提议 order,order_lines 提议 order line。同一概念的多张表共享一个类。没有主键的表不能成为类,其锚定会被拒绝,并说明是哪张表。
你自己完成的锚定,无论是在界面中、在配置中还是通过 Polly,都属于已整理的锚定。同步永远不会移动它,而把一张表锚定到已整理的术语上会替换掉它的草稿提议。当一个概念已经是持有非键列的属性时,它的表不会得到提议;本体会把这些表列在 待审核 下。
键属于类¶
主键没有自己的术语。它的每一列,包括复合键的各个部分,都会把引用放在所属表的类上。
外键也是如此。已声明关系中"多"一侧的每一列,都会把引用放在目标表的类上,无论这一列叫什么名字。employees 上指回 employees 的 manager_id 会落在 employee 上;"manager" 这个角色体现在关系的名字里。没有声明关系的列就是属性,即使它的名字与某个类相同。
Provisa 只通过推导来放置键的引用,时机是表同步、关系变化或表的类发生变化时。你不能手动移动键列;拒绝信息会说明该列、它的表以及它的类。把一张表锚定到另一个术语上,它的键会立即跟过去。
多张表中的同一实体¶
来自不同表的实例在你另行说明之前都是彼此不同的。当 customers 和 crm_contacts 描述的是同一个客户时,把连接它们的关系标记为 同一实体。它必须连接同一个类所锚定的两张表,一对一,并且基于两侧各自的键:主键或已声明的唯一约束。
只要某张表上存在同一实体关系,它的类就不能被撤下或替换。请先取消该关系的标记。
一个类锚定了多张表,而同一实体关系没有把它们全部连接起来时,会在 待审核 下标记为 未关联的表。
术语如何推导¶
Provisa 会按照一条确定性的规范化规则,从每个列名自动创建一个草稿术语:统一大小写、按分隔符和 camelCase 切分、展开缩写,以及去掉末尾的代理词元。
缩写展开 会把常见的企业缩写映射为完整形式:cust → customer、txn → transaction、qty → quantity 等等。id 和 key 都会展开为 identifier。这张表是固定且谨慎的。像 st、min 和 no 这样有歧义的缩写保持原样,避免猜错。
去除代理词元 会去掉末尾的 identifier、code、index 或 reference 词元。名为 cust_id 的列指的不是标识符本身,而是通过一个代理值指向某个客户。去掉代理后,cust_id 和 customerId 都会落到术语 customer 上。只会去掉末尾的词元,而且永远不会去掉最后剩下的那个,所以单独的 id 列会展开为 identifier 并停在那里。
关键在于 去重。这条规则是确定性的,所以 cust_id、customerId 和 CUSTOMER_KEY 都会得到 customer。每一列都获得指向这同一个术语的引用,整理工作只需在一个地方添加定义,而不是三个。
键列不走这条规则。它们的引用会去往一个类,如上所述。
通用短语¶
有些规范化后的短语太过通用,本身无法构成一个概念。单独的 name、date 或 identifier 列指的是其所属表的概念的一个属性,而这个概念离开那张表就不存在。员工有名字,产品也有名字,但它们不是一回事。
当某个短语属于通用集合并且存在表上下文时,术语会被限定为 <表概念> <短语>:employees.first_name 规范化为 employee first name。
通用集合包括属性名词(name、date、status、type、amount、quantity)、审计类短语(created_at、modified_by、submitted_timestamp),以及其他几个几乎每张表上都会出现的短语。
术语跟随业务名称¶
推导出的术语跟随列的 业务名称:如果建模者设置了别名,就用别名,否则用物理名称。当 usr_nm 的别名是 user name 时,推导出的术语就是 user name,而展开 usr_nm 可能会得到 user number。
给列设置别名是更有力的修正。别名会传递到每一个读取该列的界面(SQL、GraphQL、AI 代理、目录),因此模型在任何地方都能正确地描述自己。重命名术语只修正一个目录条目,下一个读者看到的列名仍然是 usr_nm。界面中的草稿横幅也是这么说的:先给列设置别名,只有在列名正确而词汇不对时才重命名术语。
重新设置列的别名会重新推导它的草稿术语,因此本体始终跟随模型,绝不会两次要求同一个修正。一旦整理人为某个术语添加了定义、关系、专家或标签,修改别名就不会再移动该列,因为那是整理人的工作,会被保留下来。
访问路径式表名¶
有些表名描述的是访问路径而不是概念:user_by_name 是通过名字查找到的用户,而不是一种单独的实体。Provisa 推导表的概念时,会在连接词处截断名称,所以 user_by_name 变成 user,orders_by_customer 变成 order。
如果不截断,user_by_name 会提议一个类 user name,与真正的属性 users.name 冲突。截断只适用于表概念。在列名中,by 是复合名词的一部分,所以 pet_by_name 和 pet_name 会规范化为同一个术语 pet name。
状态¶
一个术语在任一时刻只有一个状态。
| 状态 | 含义 | 如何进入该状态 |
|---|---|---|
| 草稿 | 在拥有定义并触达数据之前,代理、搜索和目录都无法使用。 | 每个推导出的术语都从这里开始。 |
| 生效 | 已准入:提供给代理、搜索和目录。 | 已定义、已锚定且在用。 |
| 已弃用 | 正在退出。 | 整理人弃用一个生效的术语,或者一个已整理的术语失去了最后一列。 |
| 已停用 | 不再使用,作为记录保留。 | 整理人将其停用并指定一个继任术语。 |
准入规则¶
一个术语满足以下三个条件时即为生效。
- 在用。 它没有被停用,也没有因为失去最后一列而被弃用。整理人弃用的术语在计划停用日期之前仍然在用。
- 已定义。 它带有定义。从列名推导出的术语只是一个词元。没有定义,它就是等待整理人的草稿,绝不是代理可以据以提问的词汇。
- 已锚定。 它通过在用的术语连接到一个持有列或表的术语。本体是进入数据的入口,所以每条链都必须终止于数据。
连通性会在图中传播。概念可以通过任何触达数据的在用邻居触达数据。不在用的术语不传导,所以已停用的术语不会让依赖它的术语继续存活。
弃用术语¶
当一个生效的术语正在退出但仍在使用时,就弃用它。你需要给出原因(必填),还可以选填一个计划停用日期,今天或以后。在那个日期之前,术语仍然在用,并继续参与准入规则。到期后,调度器会将其停用。
一个已到期但仍持有列或表的术语不能按日期停用,因为只有继任术语才能接收它们。它会等待,待审核 会把它列为 停用受阻,直到你用一个继任术语将它停用。
一个已整理的术语失去最后一列时会被自动弃用并保留。它退出使用,保留编辑者提供的内容,如果同一列再次出现就会恢复。一个未整理且不再有任何列的术语会被删除。
停用术语¶
停用一个术语会把它所关联的一切移到一个 继任术语 上,然后让它退出使用。
- 属性的列会移到继任术语上。继任术语必须是属性或概念。
- 类的表会移到继任术语上,它们的键随之移动。继任术语必须是类或概念。
- 概念不持有任何东西,所以它的继任术语是可选的。
停用需要一个原因,并会写入一条从继任术语指向被停用术语的 REPLACES 边。被停用的术语作为一条惰性记录保留:它的定义、标签、关系、专家和原因。它不传导任何东西。
由于它的列现在属于继任术语,已停用术语的面板会显示它 最后应用于 什么:在停用之前的那次提交中,模型所记录的它的列和表。面板还会链接到替换它的术语。
恢复术语¶
恢复 会撤销整理人所做的声明。已弃用的术语不再处于弃用状态。已停用的术语会以一个空的概念、草稿状态回来,因为它的列已经移给了继任术语,它的 REPLACES 边也会被删除。
什么使术语成为已整理¶
由列规范化产生的术语起初是空的。只要具有以下任意一项,它就成为已整理的术语:
- 已保存的定义
- 一条关系边
- 一位已指派的领域专家
- 一个标签,例如
pii - 一次停用
已整理的术语在其列离开时会被保留。同步永远不会把已整理术语的列重新推导到别处。
从表重新同步¶
每当保存或重新加载一张表时,Provisa 都会把它的列与本体进行核对。新列会创建或关联术语,离开的列会失去引用,任何没有剩余引用的术语都会按上面的规则被删除或弃用。键列会去往它们的类,没有类的有键表会提议一个类。
只有未整理的术语会被重新推导。如果你给某列设置别名而它的草稿术语随之改变,该列会移到新术语上。如果术语是已整理的,该列会留在原处,因为修改别名不会覆盖整理人的选择。
如果删除某个术语会让一个概念失去通往数据的路径,Provisa 会改为弃用这个术语,这样你搭建的结构就会保留下来,直到你重新连接它。
关系¶
术语之间通过类型化的边相互关联。
| 类型 | 含义 |
|---|---|
KIND_OF |
源术语是目标术语的一种。 |
PART_OF |
源术语是目标术语的组成部分。 |
SYNONYM_OF |
两个术语在此领域中可以互换。 |
RELATED_TO |
一种松散的关联,用于没有更强断言适用的情况。 |
VALID_VALUE_OF |
源是目标枚举或值域中的一个允许值。 |
DERIVED_FROM |
源由目标计算或获取而来。 |
REPLACES |
源取代目标。停用一个术语会从它的继任术语写入一条这样的边。 |
PREFERRED_TERM_FOR |
相对于不推荐使用的目标,源是首选术语。 |
TRANSLATION_OF |
源是目标在另一种语言或区域设置下的翻译。 |
ANTONYM_OF |
源在语义上与目标相反。 |
关系是有方向的。界面会同时显示出边(本术语 → 另一个术语)和入边(另一个术语 → 本术语),并为每个方向标注各自的易懂说法。
这些边存放在一张声明为连接关系的关联表中。它的关系类型列是判别列,因此上面的每种类型都是两个术语节点之间一个独立的 Cypher 关系类型。其中没有任何本体特有的东西:它的声明方式与你在自己的表上声明连接关系的方式相同,由同一套代码读取。
概念¶
概念没有自己的列或表。用它来表示一个跨越多个具体术语的业务概念,然后把它连接到确实持有数据的术语上。例如,revenue 可以是一个概念,带有来自 order amount、adjustment amount 和 refund amount 的 PART_OF 边。
一个无法通过关系图触达任何列或表的概念不指代任何数据。它不会出现在代理的术语搜索中,也不会出现在元数据导出中,待审核 会把它列为 无数据。域只适用于概念。其他任何术语都从它所锚定的表或它所持有的列获取域。
按含义标记 PII¶
PII 是列所代表含义的一种性质,所以 Provisa 让你只在术语上标记一次,就能覆盖具有该含义的每一列,包括以后注册的列。
pii 标签只能加在列上或属性类术语上,绝不能加在源、表、类或概念上。术语必须已定义且在用(生效或已弃用)才能带上它。给草稿术语加标记会被拒绝,提示"定义 术语 后才能标记";在取消标记之前,你也不能清空已标记术语的定义。
已标记术语的每一列都带有 pii,并随之带有 sensitive,无论在哪里读取标签都是如此:治理、脱敏、敏感度、导出以及标签视图。不会向列复制任何东西。移到该术语上的列会立即带上标签,移出的列则不再带有。每一列都会说明它的标签从何而来:是在列上设置的,附带原因;还是通过某个术语,并给出术语名称。
当你标记一个所属术语为属性的列时,界面会询问是否同时标记具有相同含义的其他列。
- 是 把标签加在术语上。
- 仅此列 只标记这一列,并询问原因。
通过所属术语成为 PII 的列不能单独取消标记。请取消该术语的标记,或者把这一列移到与其内容相符的术语上。
会丢失标签的移动¶
把一列移到另一个术语上可能会去掉它的标签:把 customers.email 从 customer email(带 pii 标记)移到一个未标记的术语上,会让电子邮件列失去保护。任何由人执行的移动都会先经过检查。这包括认领或移动列、停用术语,以及保存或删除一个会重新安置键列的关系。
当某列会完全失去 pii 时,移动会被拒绝,直到你做出决定。界面会显示一份汇总,列出每个被移动的列会失去和获得什么,先列出失去的。
- 移动 继续执行,并确认每个丢失的标签。
- 移动并标记 会在同一次变更中把丢失的标签带到这些列要去的术语上。
- 取消 不移动任何东西。
如果某列通过自身的标记保留了标签,就不需要确认。由模型自己完成的移动,例如重新推导草稿的列,绝不会改变继承来的标签。
待审核¶
本体会把需要你关注的事项作为发现项报告出来。有任何发现项的术语即为 待审核,术语列表可以按此筛选。普通的草稿不算发现项;草稿是本体的常态。
| 发现项 | 含义 | 处理方法 |
|---|---|---|
| 未关联的表 | 一个类锚定了多张表,而同一实体关系没有把它们全部连接起来。 | 在这些表之间标记同一实体关系。 |
| 类与属性 | 一个类持有不是其键的列,或者一张有键的表因为其概念是属性而没有类。 | 把这些列移到一个属性上,或者重新锚定这张表。 |
| 标签对象类型错误 | 一个不是属性的术语带有一个只有属性才会传给列的标签。 | 取消该标签。 |
| 停用受阻 | 一个已弃用的术语已过计划停用日期,但仍持有列或表。 | 用一个继任术语将其停用。 |
| 无数据 | 一个在用的概念无法触达任何数据。 | 把它关联到一个持有数据的术语上。 |
发现项只负责报告;在你采取行动之前,它们不会改变任何东西。
元数据导出¶
本体会作为元数据导出的一部分发布到外部数据目录。只有生效的术语会被发布,并且依据实际发布的列和表来判断。如果一个术语的列全部被排除在导出之外,原因是它们的表不是数据产品或被技术过滤器排除,那么这个术语在导出时不算已锚定,即使它在控制平面中持有列。
已弃用的术语发布时会带上它的状态、原因和计划停用日期,以便每个目录把它映射到自己的弃用标记上。
只有当两端的术语都被发布时,关系边才会发布。列资产独立导出,所以排除一个术语并不会隐藏底层数据。
将术语排除在导出之外¶
有些列承载的是底层管道数据,例如 ETL 批次标识符、行版本和摄取时间戳。从这样的列推导出的术语可能有准确的定义,但仍然不是业务词汇。从元数据导出中排除 控件会把该术语以及所有终止于它的关系边排除在 Provisa 发布的目录之外。列本身仍会作为资产导出。
关键在于业务是否使用这个词。ETL 批次标识符有明确的含义,在本体中对工程师有用,但它不属于与 customer 和 revenue 并列的业务目录。
使用本体¶
在导航栏中打开 本体。左侧面板列出每个术语及其角色,如果术语不是生效状态,还会显示其状态。已弃用 和 草稿 复选框用于显示或隐藏这些术语,待审核 会把列表缩小到有发现项的术语。点击一个术语即可打开它的面板。
面板显示术语的角色和状态;对于属性,还会显示它的 PII 标记以及覆盖的列数。已弃用或已停用的术语会显示是谁改变了它的状态以及原因。有发现项的术语打开时会带有一个 待审核 部分:点击某个发现项,可以查看发现了什么以及能解决它的操作。
编辑 会把整个术语作为一个表单打开。保存时会一并应用所有更改。
- 重命名 术语以改变其措辞,而不移动它的列。
- 添加定义:直接输入,或点击 AI 草稿按钮,根据术语名称、它的列和它的关系生成一个起点。在你保存表单之前,草稿不会被保存。
- 认领列,把其他术语的列认领到这个术语上;或者在它自己的某一列旁选择 移到术语。每一列只属于一个术语。键列跟随它们的类,不能移动。
- 锚定表 到一个类上,或者移除它们。
- 在属性上 标记 PII。
- 添加关系 并选择其类型。直接修改现有边的类型,而不是删除后重新创建。
- 按用户 ID 指派专家,身份为
expert或author。
在"编辑"旁边,面板会提供该术语允许的状态操作:对生效的术语 弃用,对任何在用的术语 停用,对已弃用或已停用的术语 恢复。
在 ✨ 菜单中,定义 会一次性填充所有空白定义,绝不会覆盖人写的文本。关系 会为整个术语列表提议类型化的边;提及未知术语、同一术语出现两次或类型无法识别的提议会被丢弃。
术语上的 草稿 横幅会告诉你它是未定义(给列设置别名或添加定义),还是未锚定(把它关联到一个有数据的术语上)。只要你还能看到这个横幅,代理和目录就无法触达该术语。