17-Oracle 23 ai-JSON-Relational Duality-代码实践-实操

Oracle Database 23ai JSON关系二元性将关系模型和文档模型的优势统一在单个数据库中,而无需进行前面讨论的任何权衡。Oracle Database 23ai 中启用此功能的新功能称为JSON 关系二元性视图(JSON Relational Duality)。

别让有限的数据类型或编程语言妨碍开发和创新 — 这个融合数据库支持所有现代数据类型、工作负载和开发风格,简化应用开发。 充分可以利用 JSON Relational Duality 简化文档模型,从而获得关系框架的可扩展性。 使用内置的 APEX 平台,加快由生成式 AI驱动的低代码开发速度。使用容器化的可插入数据库,简化微服务的开发和部署。

后续填上APEX部署和开发的坑,现在实操代码,验证特性。

一、代码实践环境准备--Oracle 23 ai free-23.8.0.25.04

SYS@FREE> SELECT BANNER_FULL FROM v$version;

BANNER_FULL
------------------------------------------------------------------------------------------------------------------------
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.8.0.25.04

 1. 创建基础表

-- 1. 创建基础表(调整自增列定义)
CREATE TABLE departments3 (
    dept_id   INTEGER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY,
    dept_name VARCHAR2(50) NOT NULL,
    location  VARCHAR2(100),
    budget    NUMBER(12,2)
);

CREATE TABLE employees3 (
    emp_id     INTEGER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY,
    emp_name   VARCHAR2(50) NOT NULL,
    job_title  VARCHAR2(50),
    hire_date  DATE,
    salary     NUMBER(9,2),
    dept_id    INTEGER NOT NULL REFERENCES departments3(dept_id)
);

SYS@FREE> DESC DEPARTMENTS;
 名称                                                            是否为空? 类型
 ----------------------------------------------------------------- -------- --------------------------------------------
 DEPT_ID                                                           NOT NULL NUMBER(38)
 DEPT_NAME                                                         NOT NULL VARCHAR2(50)
 BUDGET                                                                     NUMBER(10,2)

SYS@FREE> DESC EMPLOYEES3;
 名称                                                            是否为空? 类型
 ----------------------------------------------------------------- -------- --------------------------------------------
 EMP_ID                                                            NOT NULL NUMBER(38)
 EMP_NAME                                                          NOT NULL VARCHAR2(50)
 JOB_TITLE                                                                  VARCHAR2(50)
 HIRE_DATE                                                                  DATE
 SALARY                                                                     NUMBER(9,2)
 DEPT_ID                                                           NOT NULL NUMBER(38)

SYS@FREE>

2. 定义 Duality View​ 

--FROM employees3 e WITH INSERT UPDATE DELETE  -- 所有权限
-- 2. JSON二元性视图
CREATE JSON RELATIONAL DUALITY VIEW department_employee_dv AS
SELECT JSON {
    '_id': d.dept_id,
    'departmentName': d.dept_name,
    'location': d.location,
    'annualBudget': d.budget,
    'staff': [ 
        SELECT JSON {
            'employeeId': e.emp_id,
            'name': e.emp_name,
            'position': e.job_title,
            'startDate': e.hire_date,
            'salary': e.salary
        } 
        FROM employees3 e WITH UPDATE INSERT DELETE 
        WHERE e.dept_id = d.dept_id
    ]
} 
FROM departments3 d WITH UPDATE INSERT DELETE;
视图已创建。

SYS@FREE> DESC dept_emp_dv
 名称                                                            是否为空? 类型
 ----------------------------------------------------------------- -------- --------------------------------------------
 DATA                                                                       JSON

SYS@FREE>

3. 文档操作验证

-- 3. 插入部门及员工文档(不指定ID)
INSERT INTO department_employee_dv VALUES ('{
    "departmentName": "Research",
    "location": "Building 7",
    "annualBudget": 750000,
    "staff": [
        {"name": "James", "position": "Scientist", "startDate": "2022-03-15", "salary": 8200},
        {"name": "Linda", "position": "Lab Manager", "salary": 9500}
    ]
}');

-- 4. 验证关系数据
SELECT * FROM departments3;
/*
DEPT_ID DEPT_NAME  LOCATION      BUDGET
------- ---------- ----------- ---------
     1  Research   Building 7   750000
*/

SELECT * FROM employees3;
/*
EMP_ID EMP_NAME JOB_TITLE    HIRE_DATE   SALARY DEPT_ID
------ -------- ------------ ----------- ------- -------
    1  James    Scientist    15-MAR-22    8200       1
    2  Linda    Lab Manager               9500       1
*/

-- 5. 修正后的插入
INSERT INTO department_employee_dv VALUES ('{
    "_id": 100,
    "departmentName": "Development",
    "location": "Building 5",
    "annualBudget": 900000,
    "staff": [
        {"employeeId": 101, "name": "Alex", "position": "Developer", "salary": 8800},
        {"name": "Sophia", "position": "QA Engineer", "salary": 7800}
    ]
}');

-- 6. 验证指定ID的数据
SELECT * FROM departments3 WHERE dept_id = 100;
/*
DEPT_ID DEPT_NAME     LOCATION      BUDGET
------- ------------ ----------- ---------
   100  Development   Building 5   900000
*/

SELECT * FROM employees3 WHERE dept_id = 100;
/*
EMP_ID EMP_NAME JOB_TITLE       SALARY DEPT_ID
------ -------- -------------- ------- -------
   101 Alex     Developer         8800     100
   102 Sophia   QA Engineer       7800     100
*/

-- 7. 混合插入示例(自动生成ID)
INSERT INTO department_employee_dv VALUES ('{
    "departmentName": "Marketing",
    "location": "Building 3",
    "annualBudget": 650000,
    "staff": [
        {"name": "Michael", "position": "Designer", "salary": 7200}
    ]
}');

-- 8. 验证自动生成的ID
SELECT d.dept_id, e.emp_id, e.emp_name
FROM departments3 d
JOIN employees3 e ON d.dept_id = e.dept_id
WHERE d.dept_name = 'Marketing';
/*
DEPT_ID EMP_ID EMP_NAME
------- ------ --------
     3      3 Michael
*/

 4. 关系操作验证

SYS@FREE> SELECT * FROM employees WHERE emp_name='David';

    EMP_ID EMP_NAME                                           HIRE_DATE               SALARY    DEPT_ID
---------- -------------------------------------------------- ------------------- ---------- ----------
         1 David                                                                        8100

SELECT json_query(data, '$.staff[*]?(@.name=="David")')
  2  FROM dept_emp_dv;

JSON_QUERY(DATA,'$.STAFF[*]?(@.NAME=="DAVID")')
--------------------------------------------------------------------------------
SYS@FREE>
-- 通过 SQL 添加员工

INSERT INTO employees (emp_name, salary, dept_id)
  2  VALUES ('David', 8100,
  3      (SELECT dept_id FROM departments WHERE dept_name='Engineering'));

已创建 1 行。

SYS@FREE>

​二、VIEW视图设计原则

  • 嵌套文档不超过 3 层
  • 单个文档 < 100KB
  • 避免 WITH UPDATE 过多字段

    开发规则比较

传统模式Duality 模式
前后端模型转换层前端直连 JSON 视图
ORM 框架复杂配置零配置自动映射
双重数据验证单一源头验证

​    事务范式

  • 文档级乐观锁 vs 传统行级锁(并发提升 3-5 倍)。
  • 实现跨文档 ACID 事务。

    JSON 关系二元性简化了应用程序开发

  • 开发现在可以获得 JSON 文档模型的灵活性和数据访问优势以及关系模型的存储效率和强大功能。

  • 二元性视图是关系数据上完全可更新的 JSON 视图。应用程序可以简单地读取与应用程序层对象相对应的文档,进行必要的更改,然后将文档写回,而无需担心底层关系结构、类型映射或数据一致性。

  • 可以基于一组关系表创建多个二元性视图,从而能够针对相同数据灵活开发多个应用程序用例。

  • 使用二元性视图的应用程序操作可以在数据库内以合适的方式执行。

  • 新的乐观并发控制算法允许高并发的更新与交互应用,同时提供强大的文档级可串行性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值