如何在 Oracle SQL 中创建嵌套的 table 引用?

How to create a nested table of refs in Oracle SQL?

考虑以下问题:

There's the Transaction type and the Service type. Each transaction covers one or more services at a time. However, two different transactions may cover same services.

现在,使用关系数据库设计可以很容易地整合这一点。您将有一个 table 用于交易 transaction id, and then some data fields,一个 table 用于服务 service id, some data fields,第三个 table 将交易 ID 链接到服务 ID。这样,服务数据就不会重复,如果您需要,比如说,检索事务中涉及的所有服务,您只需执行两个连接 transactions join third_table join service.

据我所知,ref 只是存储它指向的记录(对象)的 ID,并隐式地在 deref() 上进行连接。所以,假设,如果任何事务必须只涵盖其中一项服务,我可以对服务对象使用 ref 而不是服务 ID + 显式连接。

据我所知,

A nested table 只是一个私有的 table,它将一个对象的 ID 链接到另一个对象的整个对象,并且在该类型的所有对象之间共享声明嵌套 table。如果我没有大错特错的话,这个概念也在幕后使用连接。因此,如果服务在所有交易中都是唯一的,原则上我可以在交易中使用 nested table of services

但是,问题是每笔交易可能有不止一项服务 and 他们可以重复。所以面向对象的解决方案,在我看来,就是一个nested table of ref to service里面的事务。但是,我无法在 Internet 上找到有关此想法的语法的任何线索以及是否完全可以这样做。

这是我的目标的 Oracle SQL 类伪代码(它不起作用):

create type Service_Type as object(
    id           number(5),
    -- some other data --
    cost         number(4),
    name         varchar2(32),
    description  varchar2(32)
    ---------------------
);
/
create table Service_Table of Service_Type (id primary key);
/
create type Service_Reference_Type as ref Service_Type scope is Service_Table;
/
create type Service_Reference_Table_Type as table of Service_Reference_Type;
/

create type Transaction_Type as object(
    id           number(5),
    services     Service_Reference_Table_Type,
    -- some other data --
    name         varchar2(32),
    description  varchar2(32)
    ---------------------
);
nested table services store as Transaction_Service_Nested_Reference_Table;
/

作为旁注:我知道面向对象的 DBMS 是垃圾,我不打算在任何实际项目中使用它。这是大学作业(我想知道他们为什么教这些东西)。

我不认为你离得太远,但你不需要 Service_Reference_Type,你可以一步创建一个 table 个 refs:

create type Service_Type as object(
    id           number(5),
    -- some other data --
    cost         number(4),
    name         varchar2(32),
    description  varchar2(32)
    ---------------------
);
/

create table Service_Table of Service_Type (id primary key);

create type Service_Reference_Table_Type as table of ref Service_Type;
/

create type Transaction_Type as object(
    id           number(5),
    services     Service_Reference_Table_Type,
    -- some other data --
    name         varchar2(32),
    description  varchar2(32)
    ---------------------
)
/

create table Transaction_Table of Transaction_Type
nested table services store as Transaction_Service_Nested_Reference_Table;

db<>fiddle包括插入和查询数据。

Is there a way one could scope the refs too?

@MTO 链接到:

alter table Transaction_Service_Nested_Reference_Table
add scope for (column_value) is Service_Table;

db<>fiddle