Domain 类型这功能,我给满分,但推广难度给零分

26ai 的 Data Use Case Domain 是个被严重低估的特性。简单说,它允许你定义一种"业务语义类型",比如 EMAIL_DOMAIN、PHONE_DOMAIN,封装 CHECK 约束、显示格式、甚至错误提示信息,然后在多个表里复用。这本质上是在数据库层做了 DDD(领域驱动设计)的落地。

8.1 为什么我说推广难度是零分

技术本身很优雅,但问题出在开发流程上。我们给一个客户推这个特性,客户的 Java 团队直接懵了:"我在 Hibernate 里定义 Validator 不就行了,干嘛要在数据库层做?"这就是典型的"技术正确但场景错位"。Domain 类型确实能保证任何绕过应用层的写入(比如 ETL、DBA 手工修复)都遵守业务规则,但现在的开发团队根本不信有人会绕过应用层写库。

另外,Domain 类型跟 Duality View 集成时有个坑:如果你在 Domain 里定义了显示格式(DISPLAY 子句),Duality View 生成的 JSON 里不会自动应用这个格式,它只存原始值。比如 EMAIL_DOMAIN 定义了 lower_case 显示,但 JSON 里的邮箱地址还是大写,因为 JSON 序列化走的是底层列的原始值,不走 Domain 的格式化层。MOS 上说这是"expected behavior",但客户觉得这是 bug。

8.2 实验:Domain 约束继承与跨表复用

-- 定义 Domain
CREATE DOMAIN email_domain AS VARCHAR2(100)
    CONSTRAINT valid_email CHECK (REGEXP_LIKE(VALUE, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'))
    DISPLAY LOWER(VALUE);

-- 多表复用
CREATE TABLE users (
    user_id NUMBER PRIMARY KEY,
    email email_domain  -- 自动继承 CHECK 和显示格式
);

CREATE TABLE suppliers (
    sup_id NUMBER PRIMARY KEY,
    contact_email email_domain
);

-- 测试约束
INSERT INTO users VALUES (1, 'BAD_EMAIL');
-- ORA-11534: check constraint (VALID_EMAIL) of domain EMAIL_DOMAIN violated

-- 测试显示格式
SELECT email FROM users WHERE user_id = 1;
-- 存储时 'Test@Example.COM',查询返回 'test@example.com'

我的建议是:Domain 类型适合"数据治理成熟度高的企业",也就是有专门的数据架构团队、ETL 流程复杂、多系统直连数据库的场景。如果是个敏捷小团队,别强推,他们会觉得你在增加他们的认知负担。


请使用浏览器的分享功能分享到微信等