【问题标题】:Oracle table having 1-M relationship with itself与自身有 1-M 关系的 Oracle 表
【发布时间】:2017-07-13 02:03:30
【问题描述】:

假设我有一张Staff 的表格

create table staff (
    staffID number,
    staffName varchar2(255)
);

但每个员工都有零个或多个下属,他们也是员工。

如何设计桌子?

我正在考虑添加一个引用 staff 表上另一行的额外列

alter table staff add (subordinateID number not null);

为了使其成为外键,我还必须将 subordinateID 设为主键

alter table staff add constraint pk primary key (staffID, subordinateID);

当我实际引用时,即将从属 ID 链接到下属的 staffID

alter table staff add constraint fk foreign key (subordinateID) references staff (staffID);

有错误

ORA-02270: 此列列表没有匹配的唯一键或主键

这让我很困惑,因为我已经将staffID 作为主键的一部分?应该怎么做才能解决这个问题,我应该如何设计桌子?

【问题讨论】:

    标签: sql oracle database-design foreign-keys ddl


    【解决方案1】:

    由于一个员工可以有多个下属,因此保留一个从属 ID 列可能是个坏主意 - 它违反了 1NF。相反,我建议从另一个方向看,每个员工都保留其经理的唯一 ID:

    CREATE TABLE staff (
        staffID NUMBER NOT NULL,
        staffName VARCHAR2(255),
        managerId NUMBER
    );
    
    ALTER TABLE staff ADD CONSTRAINT staff_pk PRIMARY KEY (staffID);
    
    ALTER TABLE staff ADD CONSTRAINT staff_fk
    FOREIGN KEY (managerID) REFERENCES staff (staffID);
    

    【讨论】:

      【解决方案2】:

      这是行不通的,因为会有多个下属,你想要的是一个具有从属 ID 和 managerid 的联结表,然后你可以从中构建层次结构,因为你想看到整个链。

      【讨论】:

        【解决方案3】:

        试试这个:

        create table staff (
            staffID number primary key,
            staffName varchar2(255),
            bossID number
        );
        
        alter table staff add constraint fk_staff_boss
            foreign key (bossID) references staff(staffID);
        

        【讨论】:

        • 虽然这在大多数情况下都行得通,但我经常遇到一个人可以直接向两个人汇报的组织,这就是为什么我推荐使用联结表的原因。
        • 这个答案解决了我的问题,但@HLGEM 我认为你创建联结表的想法更有意义,关系明智
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-17
        • 2016-09-06
        • 2019-03-11
        • 2018-08-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多