Oracle官方文档翻译《Database Concepts 23ai》第8章-应用程序数据使用
Oracle官方文档翻译《Database Concepts 23ai》第8章-应用程序数据使用
8 Application Data Usage(应用程序数据使用)
本章将介绍什么是应用程序使用领域(application usage domains)和应用程序使用注释(application usage annotations)。
Data Use Case Domains(数据用例领域)
数据用例领域(data use case domain)是一种高级数据字典对象,隶属于某个模式,并且封装了一组可选属性和约束。
Schema Annotations(模式注释)
对于许多应用程序而言,为表、视图、表列、索引和领域等数据库对象维护额外的属性元数据至关重要。
Data Use Case Domains(数据用例领域)
数据用例领域是一种高级数据字典对象,隶属于某个模式,并且封装了一组可选属性和约束。
数据库通常对应用程序实际如何使用数据了解有限。数据库使用VARCHAR2
、NUMBER
或DATE
等基本类型存储数据,而关于存储的值代表什么(例如信用卡号或出生日期)的信息,仅存在于应用程序级元数据或上下文当中。这种方式会增加单个应用程序的复杂性,导致不同工具和应用程序对数据使用的认知分散,并且可能引发语义不一致的问题。
过去为解决这种不一致问题,曾尝试向数据库中添加更多特定于使用场景的内置数据类型,并支持用户定义类型以实现可扩展性。然而,更复杂的数据库类型系统 adoption 率有限,因为这会加大与应用程序语言类型的不匹配程度,生成不可移植的应用程序代码,并且由于跨不同类型的操作受到限制,会增加开发复杂性。
通过使用符合SQL标准的Oracle数据库扩展领域概念,可以避免上述在数据使用表示方面的限制。采用这种方式,声明列时既可以指定NUMBER
等基本数据类型,也可以指定数据使用领域(如“Temperature(温度)”或“Credit Score(信用评分)”)。此类用例领域还可选择性地关联不同的使用属性,例如检查约束、显示属性、排序规则等。最重要的是,应用程序可以利用集中化的领域信息来标准化操作,而无需依赖应用程序级元数据;例如,对信用卡号进行掩码处理、格式化电话号码和货币值、将列中的百分比值以饼图形式显示等。
用例领域不会修改底层数据类型,因此也可以添加到现有数据中,而不会破坏应用程序或引发可移植性问题。一个用例领域可以为表中的一个或多个列声明,也可用于表示可变的使用场景(在这类场景中,数据的实际用途取决于其他列中的数据)。可以将用例领域视为轻量级的类型修饰符,用于集中记录应用程序预期的数据使用方式。此外,用例领域还可用于共享注释。
删除带有关联用例领域的表,与删除带有关联PL/SQL类型的表,可能会产生不同的结果。删除带有关联用例领域或PL/SQL类型的表时,需遵循以下规则:
- 如果删除表时未使用
PURGE
子句,那么该表仍会保留在回收站中(若回收站已启用),以便日后可能进行恢复。 - 如果表中某一列使用PL/SQL类型或抽象数据类型,且另一列关联了用例领域,那么:
- 使用
FORCE
子句删除用例领域后,该表仍可恢复。此时,用例领域只是与该列解除了关联。 - 删除PL/SQL类型时(无论是否使用
FORCE
子句),都会将表从回收站中彻底清除,因为该表无法完全恢复。
- 使用
用例领域的特征:
- 约束(Constraints):领域可用于在多个表和列之间共享约束。对于可延迟约束,这些约束可以被禁用。注意:领域中不允许包含主键约束和外键约束。
- 数据类型(Data types):允许使用所有Oracle内置数据类型,但
LONG
、LONG 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数据库开发指南)
更多推荐
所有评论(0)