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 视图。应用程序可以简单地读取与应用程序层对象相对应的文档,进行必要的更改,然后将文档写回,而无需担心底层关系结构、类型映射或数据一致性。
-
可以基于一组关系表创建多个二元性视图,从而能够针对相同数据灵活开发多个应用程序用例。
-
使用二元性视图的应用程序操作可以在数据库内以合适的方式执行。
-
新的乐观并发控制算法允许高并发的更新与交互应用,同时提供强大的文档级可串行性。
1019

被折叠的 条评论
为什么被折叠?



