ORACLE ---- 和PostgreSQL继承表类似的实现方式

Posted Scott

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORACLE ---- 和PostgreSQL继承表类似的实现方式相关的知识,希望对你有一定的参考价值。

昨天介绍了PostgreSQL里的继承表,今天来继续讨论ORACLE数据库里有没有类似的东西。

首先,可以明确的说,ORACLE数据库里没有继承表这种OBJECT。
但是,和PostgreSQL的继承表类似,不同Table的数据以某种方式进行关联,共享存储空间的角度来讲,ORACLE数据库也存在这样的OBJECT。

那就是CLUSTER。

首先,ORACLE数据库对“CLUSTER”是这样定义的:

CREATE CLUSTER (oracle.com)
A cluster is a schema object that contains data from one or more tables.

下面我们来看看CLUSTER是怎样应用的。

--做成CLUSTER
SQL> conn test/test@localhost:1521/pdb
接続されました。
SQL> CREATE CLUSTER object
   (object VARCHAR2(23))
SIZE 512
STORAGE (initial 100K next 50K);  2    3    4

クラスタが作成されました。

--为CLUSTR做一个索引
SQL> CREATE INDEX idx_object ON CLUSTER object;

索引が作成されました。

--做成使用CLUSTER的第一个表
SQL> CREATE TABLE object_table
   CLUSTER object (OBJECT_TYPE)
   AS SELECT * FROM dba_objects WHERE OBJECT_TYPE = \'TABLE\';  2    3

表が作成されました。

--做成使用CLUSTER的第二个表
SQL> CREATE TABLE object_index
   CLUSTER object (OBJECT_TYPE)
   AS SELECT * FROM dba_objects WHERE OBJECT_TYPE = \'INDEX\';  2    3

表が作成されました。

--确认一下两个表的状态和定义
SQL> select count(*) from object_index;

  COUNT(*)
----------
      2898

SQL> select count(*) from object_table;

  COUNT(*)
----------
      2223

SQL> @obj
object_nameに値を入力してください: object_index
旧   1: select owner,object_name,object_type from dba_objects where object_name like upper(\'&object_name\')
新   1: select owner,object_name,object_type from dba_objects where object_name like upper(\'object_index\')

OWNER                OBJECT_NAME                                        OBJECT_TYPE
-------------------- -------------------------------------------------- -----------------------
TEST                 OBJECT_INDEX                                       TABLE

SQL> @obj
object_nameに値を入力してください: object_table
旧   1: select owner,object_name,object_type from dba_objects where object_name like upper(\'&object_name\')
新   1: select owner,object_name,object_type from dba_objects where object_name like upper(\'object_table\')

OWNER                OBJECT_NAME                                        OBJECT_TYPE
-------------------- -------------------------------------------------- -----------------------
TEST                 OBJECT_TABLE                                       TABLE

SQL> @ddl
object_typeに値を入力してください: TABLE
object_nameに値を入力してください: OBJECT_INDEX
ownerに値を入力してください: TEST
旧   1: select dbms_metadata.get_ddl(\'&object_type\',\'&object_name\',\'&owner\') from dual
新   1: select dbms_metadata.get_ddl(\'TABLE\',\'OBJECT_INDEX\',\'TEST\') from dual

DBMS_METADATA.GET_DDL(\'TABLE\',\'OBJECT_INDEX\',\'TEST\')
--------------------------------------------------------------------------------

  CREATE TABLE "TEST"."OBJECT_INDEX"
   (    "OWNER" VARCHAR2(128),
        "OBJECT_NAME" VARCHAR2(128),
        "SUBOBJECT_NAME" VARCHAR2(128),
        "OBJECT_ID" NUMBER,
        "DATA_OBJECT_ID" NUMBER,
        "OBJECT_TYPE" VARCHAR2(23),
        "CREATED" DATE,
        "LAST_DDL_TIME" DATE,
        "TIMESTAMP" VARCHAR2(19),
        "STATUS" VARCHAR2(7),
        "TEMPORARY" VARCHAR2(1),
        "GENERATED" VARCHAR2(1),
        "SECONDARY" VARCHAR2(1),
        "NAMESPACE" NUMBER,
        "EDITION_NAME" VARCHAR2(128),
        "SHARING" VARCHAR2(18),
        "EDITIONABLE" VARCHAR2(1),
        "ORACLE_MAINTAINED" VARCHAR2(1),
        "APPLICATION" VARCHAR2(1),
        "DEFAULT_COLLATION" VARCHAR2(100),
        "DUPLICATED" VARCHAR2(1),
        "SHARDED" VARCHAR2(1),
        "CREATED_APPID" NUMBER,
        "CREATED_VSNID" NUMBER,
        "MODIFIED_APPID" NUMBER,
        "MODIFIED_VSNID" NUMBER
   ) CLUSTER "TEST"."OBJECT" ("OBJECT_TYPE")

SQL> @ddl
object_typeに値を入力してください: TABLE
object_nameに値を入力してください: OBJECT_TABLE
ownerに値を入力してください: TEST
旧   1: select dbms_metadata.get_ddl(\'&object_type\',\'&object_name\',\'&owner\') from dual
新   1: select dbms_metadata.get_ddl(\'TABLE\',\'OBJECT_TABLE\',\'TEST\') from dual

DBMS_METADATA.GET_DDL(\'TABLE\',\'OBJECT_TABLE\',\'TEST\')
--------------------------------------------------------------------------------

  CREATE TABLE "TEST"."OBJECT_TABLE"
   (    "OWNER" VARCHAR2(128),
        "OBJECT_NAME" VARCHAR2(128),
        "SUBOBJECT_NAME" VARCHAR2(128),
        "OBJECT_ID" NUMBER,
        "DATA_OBJECT_ID" NUMBER,
        "OBJECT_TYPE" VARCHAR2(23),
        "CREATED" DATE,
        "LAST_DDL_TIME" DATE,
        "TIMESTAMP" VARCHAR2(19),
        "STATUS" VARCHAR2(7),
        "TEMPORARY" VARCHAR2(1),
        "GENERATED" VARCHAR2(1),
        "SECONDARY" VARCHAR2(1),
        "NAMESPACE" NUMBER,
        "EDITION_NAME" VARCHAR2(128),
        "SHARING" VARCHAR2(18),
        "EDITIONABLE" VARCHAR2(1),
        "ORACLE_MAINTAINED" VARCHAR2(1),
        "APPLICATION" VARCHAR2(1),
        "DEFAULT_COLLATION" VARCHAR2(100),
        "DUPLICATED" VARCHAR2(1),
        "SHARDED" VARCHAR2(1),
        "CREATED_APPID" NUMBER,
        "CREATED_VSNID" NUMBER,
        "MODIFIED_APPID" NUMBER,
        "MODIFIED_VSNID" NUMBER
   ) CLUSTER "TEST"."OBJECT" ("OBJECT_TYPE")

--确认一下两个表的存储情况
col OWNER for a10
col SEGMENT_NAME for a20
col SEGMENT_TYPE for a18
col SEGMENT_SUBTYPE for a10
col TABLESPACE_NAME for a10
col RETENTION for a7
set lin 200 pages 999

select OWNER,SEGMENT_NAME,SEGMENT_TYPE,SEGMENT_SUBTYPE,TABLESPACE_NAME,HEADER_FILE,HEADER_BLOCK,BLOCKS,EXTENTS,RETENTION 
from dba_segments 
where OWNER=\'TEST\';

OWNER      SEGMENT_NAME         SEGMENT_TYPE       SEGMENT_SU TABLESPACE HEADER_FILE HEADER_BLOCK     BLOCKS    EXTENTS RETENTI
---------- -------------------- ------------------ ---------- ---------- ----------- ------------ ---------- ---------- -------
TEST       OBJECT               CLUSTER            ASSM       USERS               12          130         96         12
TEST       IDX_OBJECT           INDEX              ASSM       USERS               12          146          8          1

OK,已经可以确认到使用CLUSTER的两张表确实共享了存储空间。

当然,ORACLE数据库的CLUSTER和PostgreSQL继承表并不是相同的东西,上面的例子只是从多张表共享物理存储空间的角度进行了分析,至于其他的角度,就见仁见智了。

2021/06/18 @ Dalian

以上是关于ORACLE ---- 和PostgreSQL继承表类似的实现方式的主要内容,如果未能解决你的问题,请参考以下文章

如何使 BLOB 在 Oracle 和 PostgreSQL 上工作?

PostgreSQL 和 Oracle 对象关系存储是不是与 ORM 相同?

PostgreSQL角色和权限理解

PostgreSQL继承详解

postgresql----继承表inherits parent table

Oracle表空间和PostgreSQL表空间的区别?