读书笔记:白话解读Oracle嵌套表:像"套娃"一样存储数据

我们的文章会在微信公众号IT民工的龙马人生博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。

本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。

白话解读Oracle嵌套表:像"套娃"一样存储数据

什么是嵌套表?

想象你有一个俄罗斯套娃玩具,大娃娃肚子里装着几个小娃娃。Oracle的嵌套表就是这样的设计——主表(大娃娃)的每一行都可以包含一个完整的子表(小娃娃们)。

嵌套表能干什么?

嵌套表主要有两种用法:

  1. 临时使用:在PL/SQL程序里当作高级数组来用(这是最常用的方式)
  2. 永久存储:直接作为数据库表结构的一部分(实际用得少)

举个现实例子:比如一个部门表,每个部门可以包含多个员工。传统做法是用两个表加外键关联,而嵌套表让你可以直接在部门表里"嵌入"员工表。

创建嵌套表三步走

  1. 先造"小娃娃模具"(定义员工对象类型):
CREATE TYPE 员工类型 AS OBJECT (
    工号 NUMBER(4),
    姓名 VARCHAR2(10),
    职位 VARCHAR2(9),
    上司编号 NUMBER(4),
    入职日期 DATE,
    工资 NUMBER(7,2),
    奖金 NUMBER(7,2)
);
  1. 再做"装娃娃的盒子"(定义嵌套表类型):
CREATE TYPE 员工表类型 AS TABLE OF 员工类型;
  1. 最后组装"套娃"(创建主表):
CREATE TABLE 部门表 (
    部门号 NUMBER(2) PRIMARY KEY,
    部门名称 VARCHAR2(14),
    所在地 VARCHAR2(13),
    员工们 员工表类型  -- 这里就是嵌套表
) NESTED TABLE 员工们 STORE AS 员工嵌套表;  -- 指定实际存储表名

使用时的特点

  1. 查询要"拆套娃"

    • 直接查会返回一团复杂数据
    • 通常需要用特殊语法"解套":
    SELECT 部门.部门号, 部门.部门名称, 员工.*
    FROM 部门表 部门, TABLE(部门.员工们) 员工;
    
  2. 更新很特别

    -- 给10号部门员工每人加100元奖金
    UPDATE TABLE(
        SELECT 员工们 FROM 部门表 WHERE 部门号 = 10
    ) SET 奖金 = 100;
    

    这种写法就像是在操作"10号部门专属的员工表"

  3. 限制要注意

    • 不能设置某些类型的约束(比如员工不能互相引用)
    • 修改嵌套表数据时会锁定整个部门

背后的秘密

Oracle实际做了这些事:

  1. 在部门表偷偷加了个隐藏列(16字节的ID)
  2. 在员工嵌套表也加了隐藏列(用来关联部门)
  3. 自动给部门表加了主键索引
  4. 但忘记给员工表的关联列加索引!(这个坑要注意)

怎么用才高效?

如果一定要用嵌套表存储数据:

  1. 改用IOT(索引组织表)

    NESTED TABLE 员工们 STORE AS 员工嵌套表 (
        (工号 NOT NULL, UNIQUE (工号), 
        PRIMARY KEY(隐藏关联ID,工号))
    ) ORGANIZATION INDEX COMPRESS 1
    
    • 自动按部门聚簇存储员工
    • 节省空间
    • 提高查询速度
  2. 考虑数据返回方式

    • 直接返数据(默认,适合经常查看员工的情况)
    • 返指针(适合很少查看员工详情的情况)

为什么不太推荐?

  1. 浪费空间:每个嵌套表都多出隐藏列
  2. 约束多余:自动添加不必要的约束
  3. 查询麻烦:单独查员工表很困难
  4. 不够灵活:实际业务中经常需要单独查子表

实用建议

  1. 编程时多用:在PL/SQL里当高级数组很好用
  2. 存储时慎用:实际业务数据还是传统主外键更灵活
  3. 折中方案:可以在普通表上创建视图模拟嵌套表效果

就像俄罗斯套娃适合展示但不适合日常使用一样,嵌套表是个有趣的技术,但实际存储业务数据时,传统的表关联方式通常更实用。

------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)

posted @ 2025-09-05 16:04  认真就输  阅读(12)  评论(0)    收藏  举报