Oracle SQL 查询子类-table - 继承

Oracle SQL queries for subclass-table - Inheritance

我有一个 Staff table 以 staffNo 作为主键 以及从它继承的另外两个 table 中的工作人员详细信息:FTLecturerPTLecturer。我在那里使用了 Optional Or 关系。

我的问题是:如何为这些子类编写Oracle SQL查询? 我认为我不再需要为他们进行 PK,因为他们继承自“Staff”。是这样吗?

这是Stafftable

CREATE TABLE Staff
(staffNo number(10) NOT NULL,
 firstName varchar2(50) NOT NULL,
 lastName number(2) ,
address varchar2(50) NOT NULL,
CONSTRAINT courseID_pk PRIMARY KEY (staffNo),
CONSTRAINT fk_Module
FOREIGN KEY (moduleID)
REFERENCES Module(Module Module ID)
);

我需要创建 FTLecturer table 与 Optional Or 关系。

继承是Object-Oriented编程中的一个概念:它在关系数据库中没有意义。这样做最重要的影响是 child table 确实需要一个主键。

"I need to create the FTLecturer table with the Optional Or relationship."

您所描述的在关系数据库中称为 Arc:讲师可以是 full-time 或 part-time,但不能同时是两者。我们可以通过一组合适的约束来强制执行此操作。

首先在parent table中添加一列来标识讲师类型。

alter table staff add staffType varchar2(10);

这应该使用针对参考数据的外键进行验证 table,并在紧要关头检查约束。然后我们添加一个唯一约束(是的,还有一个主键):

alter table staff add constraint staff_uk unique(staffNo, staffType);

我们可以用它来强制 child table 上的弧线。

create table FTLecturer (
    staffNo number not null,
    staffType varchar2(10) not null,
    tenure varchar2(3) not null,
    constraint FTLecturer_pk primary key (staffNo),
    constraint FTLecturer_ck check (staffType = 'FTL'), 
    constraint FTLecturer_Staff_fk foreign key (staffNo, staffType)
       references staff (staffNo, staffType);

请注意,外键意味着我们只能在此 table 中插入具有 STAFF table 中正确类型的 parent 的行。这就是为什么我们需要 StaffType 列和对 STAFF table 的唯一约束。

同样 Part-Time 讲师:

create table PTLecturer (
    staffNo number not null,
    staffType varchar2(10) not null,
    hours number not null,
    constraint PTLecturer_pk primary key (staffNo),
    constraint PTLecturer_ck check (staffType = 'PTL'), 
    constraint PTLecturer_Staff_fk foreign key (staffNo, staffType)
       references staff (staffNo, staffType);

从 Oracle 11g 开始,我们可以使用虚拟列为 child table 上的 staffType 应用常量值。这避免了对检查约束的需要。 Find out more.

要为特定员工创建记录,最好在同一操作中填充 parent 和 child;我们可以使用 INSERT ALL 语法来填充多个 table。 Find out more.

最后,您可以构建一个有用的 API 视图。例如:

create or replace view fulltimeLecturer as
     select staff.*
            , ftl.tenure
     from staff
          join ftlecturer ftl
               on staff.staffno = ftl.staffno
                  and staff.stafftype = ftl.stafftype;

create or replace view parttimeLecturer as
     select staff.*
            , ptl.hours
     from staff
          join ptlecturer ptl
               on staff.staffno = ptl.staffno
                  and staff.stafftype = ptl.stafftype;

这可能会让您觉得工作量很大,而且启动起来不够灵活。这是 Object 编程和关系数据库之间的区别。 OOP 主要是通过帮助开发人员编写代码来驱动的; RDBMS 专注于保证存储数据的完整性。