读书笔记:白话解读Oracle嵌套表:像"套娃"一样存储数据
我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。
本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。
白话解读Oracle嵌套表:像"套娃"一样存储数据
什么是嵌套表?
想象你有一个俄罗斯套娃玩具,大娃娃肚子里装着几个小娃娃。Oracle的嵌套表就是这样的设计——主表(大娃娃)的每一行都可以包含一个完整的子表(小娃娃们)。
嵌套表能干什么?
嵌套表主要有两种用法:
- 临时使用:在PL/SQL程序里当作高级数组来用(这是最常用的方式)
- 永久存储:直接作为数据库表结构的一部分(实际用得少)
举个现实例子:比如一个部门表,每个部门可以包含多个员工。传统做法是用两个表加外键关联,而嵌套表让你可以直接在部门表里"嵌入"员工表。
创建嵌套表三步走
- 先造"小娃娃模具"(定义员工对象类型):
CREATE TYPE 员工类型 AS OBJECT (
工号 NUMBER(4),
姓名 VARCHAR2(10),
职位 VARCHAR2(9),
上司编号 NUMBER(4),
入职日期 DATE,
工资 NUMBER(7,2),
奖金 NUMBER(7,2)
);
- 再做"装娃娃的盒子"(定义嵌套表类型):
CREATE TYPE 员工表类型 AS TABLE OF 员工类型;
- 最后组装"套娃"(创建主表):
CREATE TABLE 部门表 (
部门号 NUMBER(2) PRIMARY KEY,
部门名称 VARCHAR2(14),
所在地 VARCHAR2(13),
员工们 员工表类型 -- 这里就是嵌套表
) NESTED TABLE 员工们 STORE AS 员工嵌套表; -- 指定实际存储表名
使用时的特点
-
查询要"拆套娃":
- 直接查会返回一团复杂数据
- 通常需要用特殊语法"解套":
SELECT 部门.部门号, 部门.部门名称, 员工.* FROM 部门表 部门, TABLE(部门.员工们) 员工; -
更新很特别:
-- 给10号部门员工每人加100元奖金 UPDATE TABLE( SELECT 员工们 FROM 部门表 WHERE 部门号 = 10 ) SET 奖金 = 100;这种写法就像是在操作"10号部门专属的员工表"
-
限制要注意:
- 不能设置某些类型的约束(比如员工不能互相引用)
- 修改嵌套表数据时会锁定整个部门
背后的秘密
Oracle实际做了这些事:
- 在部门表偷偷加了个隐藏列(16字节的ID)
- 在员工嵌套表也加了隐藏列(用来关联部门)
- 自动给部门表加了主键索引
- 但忘记给员工表的关联列加索引!(这个坑要注意)
怎么用才高效?
如果一定要用嵌套表存储数据:
-
改用IOT(索引组织表):
NESTED TABLE 员工们 STORE AS 员工嵌套表 ( (工号 NOT NULL, UNIQUE (工号), PRIMARY KEY(隐藏关联ID,工号)) ) ORGANIZATION INDEX COMPRESS 1- 自动按部门聚簇存储员工
- 节省空间
- 提高查询速度
-
考虑数据返回方式:
- 直接返数据(默认,适合经常查看员工的情况)
- 返指针(适合很少查看员工详情的情况)
为什么不太推荐?
- 浪费空间:每个嵌套表都多出隐藏列
- 约束多余:自动添加不必要的约束
- 查询麻烦:单独查员工表很困难
- 不够灵活:实际业务中经常需要单独查子表
实用建议
- 编程时多用:在PL/SQL里当高级数组很好用
- 存储时慎用:实际业务数据还是传统主外键更灵活
- 折中方案:可以在普通表上创建视图模拟嵌套表效果
就像俄罗斯套娃适合展示但不适合日常使用一样,嵌套表是个有趣的技术,但实际存储业务数据时,传统的表关联方式通常更实用。
------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)

浙公网安备 33010602011771号