8 Application Data Usage(应用程序数据使用)

本章将介绍什么是应用程序使用领域(application usage domains)和应用程序使用注释(application usage annotations)。

Data Use Case Domains(数据用例领域)
数据用例领域(data use case domain)是一种高级数据字典对象,隶属于某个模式,并且封装了一组可选属性和约束。

Schema Annotations(模式注释)
对于许多应用程序而言,为表、视图、表列、索引和领域等数据库对象维护额外的属性元数据至关重要。

Data Use Case Domains(数据用例领域)

数据用例领域是一种高级数据字典对象,隶属于某个模式,并且封装了一组可选属性和约束。

数据库通常对应用程序实际如何使用数据了解有限。数据库使用VARCHAR2NUMBERDATE等基本类型存储数据,而关于存储的值代表什么(例如信用卡号或出生日期)的信息,仅存在于应用程序级元数据或上下文当中。这种方式会增加单个应用程序的复杂性,导致不同工具和应用程序对数据使用的认知分散,并且可能引发语义不一致的问题。

过去为解决这种不一致问题,曾尝试向数据库中添加更多特定于使用场景的内置数据类型,并支持用户定义类型以实现可扩展性。然而,更复杂的数据库类型系统 adoption 率有限,因为这会加大与应用程序语言类型的不匹配程度,生成不可移植的应用程序代码,并且由于跨不同类型的操作受到限制,会增加开发复杂性。

通过使用符合SQL标准的Oracle数据库扩展领域概念,可以避免上述在数据使用表示方面的限制。采用这种方式,声明列时既可以指定NUMBER等基本数据类型,也可以指定数据使用领域(如“Temperature(温度)”或“Credit Score(信用评分)”)。此类用例领域还可选择性地关联不同的使用属性,例如检查约束、显示属性、排序规则等。最重要的是,应用程序可以利用集中化的领域信息来标准化操作,而无需依赖应用程序级元数据;例如,对信用卡号进行掩码处理、格式化电话号码和货币值、将列中的百分比值以饼图形式显示等。

用例领域不会修改底层数据类型,因此也可以添加到现有数据中,而不会破坏应用程序或引发可移植性问题。一个用例领域可以为表中的一个或多个列声明,也可用于表示可变的使用场景(在这类场景中,数据的实际用途取决于其他列中的数据)。可以将用例领域视为轻量级的类型修饰符,用于集中记录应用程序预期的数据使用方式。此外,用例领域还可用于共享注释。

删除带有关联用例领域的表,与删除带有关联PL/SQL类型的表,可能会产生不同的结果。删除带有关联用例领域或PL/SQL类型的表时,需遵循以下规则:

  • 如果删除表时未使用PURGE子句,那么该表仍会保留在回收站中(若回收站已启用),以便日后可能进行恢复。
  • 如果表中某一列使用PL/SQL类型或抽象数据类型,且另一列关联了用例领域,那么:
    • 使用FORCE子句删除用例领域后,该表仍可恢复。此时,用例领域只是与该列解除了关联。
    • 删除PL/SQL类型时(无论是否使用FORCE子句),都会将表从回收站中彻底清除,因为该表无法完全恢复。

用例领域的特征:

  • 约束(Constraints):领域可用于在多个表和列之间共享约束。对于可延迟约束,这些约束可以被禁用。注意:领域中不允许包含主键约束和外键约束。
  • 数据类型(Data types):允许使用所有Oracle内置数据类型,但LONGLONG RAW和对象类型除外。
  • 默认表达式(Default expression):允许使用默认表达式,其作用与列的默认值相同。
  • 大小写和重音不敏感搜索(Case and accent insensitive searching):领域支持大小写不敏感搜索,可用于WHERE子句和ORDER BY子句中。
  • 显示表达式(Display expression):显示表达式支持自定义显示规则。例如,以本地格式显示货币值。
  • 排序表达式(Order expression):排序表达式支持复杂排序。例如,按标准化的标准业务货币(如美元金额)进行排序。

用例领域的类型:

  • 单列(Single column):适用于单个数据列。
  • 多列(Multi-column):适用于多个列,例如货币相关列。
  • 灵活领域(Flexible domains):基于其他领域构建,且必须与子领域的数据类型兼容。例如,不同国家/地区的地址格式。
  • 枚举(Enumeration):由一组名称组成,还可选择性地包含与名称对应的取值。

严格模式与非严格模式:

  • 非严格模式(Non-strict):非严格模式的领域必须匹配指定的数据类型,但对于数值型数据,不一定需要匹配长度或精度。
  • 严格模式(Strict):要求数据类型、长度和精度完全匹配。例如,货币代码必须恰好是2个或3个字符。

您可以使用Oracle SQL创建枚举领域。与常规领域不同,枚举领域具有默认的CHECK约束和显示表达式。枚举领域中的名称可用于标量SQL表达式中允许使用文本的任何位置,并且该领域本身可像表一样用于SELECT语句的FROM子句中。枚举领域是一种特殊的使用领域,其使用方式与任何单列领域相同。

枚举领域由一组名称组成,还可选择性地包含与名称对应的取值。名称必须是有效的SQL标识符,且每个指定的取值必须是文本;如果是多列枚举,则取值为文本列表。虽然取值可以是SQL领域支持的任何数据类型,但所有取值必须属于同一数据类型。

例如,已被授予CREATE DOMAIN权限的用户SCOTT,创建一个用于表示职位头衔的单列枚举领域:

CREATE DOMAIN Job_Title AS
ENUM (
    Clerk = 'CLERK',
    Salesman = SalesPerson = 'SALESMAN',
    Manager = 'MANAGER', 
    Analyst = 'ANALYST',
    President = 'PRESIDENT'
);

现在,创建EMP表时,可以将Job_Title领域用作数据类型。例如:

CREATE TABLE emp
( 
    empno NUMBER(4) CONSTRAINT emp_pk PRIMARY KEY,
    ename VARCHAR2(10),
    job Job_Title,
    mgr NUMBER(4) CONSTRAINT emp_mgr_fk REFERENCES emp(empno),
    hiredate DATE,
    sal NUMBER(7,2)
);

插入新数据行时,可以使用该枚举领域指定JOB列的值。以下三条INSERT语句是等效的:

INSERT INTO emp VALUES (8000, 'PATEL', Job_Title.Salesman, 7698, TO_DATE('11-MAR-2024', 'DD-MON-YYYY'), 3500);
INSERT INTO emp VALUES (8000, 'PATEL', Job_Title.SalesPerson, 7698, TO_DATE('11-MAR-2024', 'DD-MON-YYYY'), 3500);
INSERT INTO emp VALUES (8000, 'PATEL', 'SALESMAN', 7698, TO_DATE('11-MAR-2024', 'DD-MON-YYYY'), 3500);

相关主题(Related Topics)
使用应用程序使用领域(Using Application Usage Domains)

Schema Annotations(模式注释)

对于许多应用程序而言,为表、视图、表列、索引和领域等数据库对象维护额外的属性元数据至关重要。

领域包含检查约束、排序规则、自定义排序顺序等内置使用属性,而为了实现可扩展性,Oracle数据库还支持通过ANNOTATIONS(注释)机制为数据库元数据(包括表列、表、索引等)添加自定义属性。应用程序通常需要维护额外的属性元数据,尤其是在渲染用户界面或自定义应用程序逻辑时。

列级使用属性的一些示例包括:

  • 显示标签(Display Label):可能与列名不同(例如,列名是Employee_Salary,但显示标题为“Salary(薪资)”)。
  • 列组(Column Group):在许多情况下,列“组”对用户界面很有用(例如,将“街道编号(Street Number)”、“街道名称(Street Name)”、“城市(City)”和“邮政编码(Zip)”列组合为“地址(Address)”组)。
  • 格式掩码(Format Mask):例如,$99,999.99的显示掩码可被用户界面工具用于将56434渲染为$56,434.00
  • 隐藏(Hide):是否在用户界面中向终端用户显示该列(例如,不向某类终端用户显示包含敏感信息的列或系统添加的列)。
  • 突出显示(Highlight):该列是否应以特殊突出方式显示。
  • 允许的操作(Allowed Operations):帮助界面确定是否允许列支持排序、分组、显示值列表等操作。

表级使用属性同样可用于帮助应用程序记录表是否包含敏感信息、表的显示名称应是什么、应用程序中哪些模块拥有或管理该表等信息。

大多数应用程序会为这类使用元数据创建自己的存储库,这不仅增加了开发人员的复杂性,还可能导致应用程序、模块和微服务之间出现元数据不一致的情况。

Oracle数据库模式注释是一种轻量级的声明式机制,供开发人员集中注册数据库模式对象的使用属性。注释直接存储在数据库内部的数据字典表中,与数据模型定义和数据本身一同存放,并且可供所有应用程序使用,以实现通用数据上的行为标准化,但数据库不会以任何方式解释这些注释。可以将它们视为数据库元数据的轻量级标准化标记,供应用程序用于注册和处理扩展的自定义使用属性。

相关主题(Related Topics)
《Oracle Database Database Development Guide》(Oracle数据库开发指南)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐