首页 > 解决方案 > 如何连接具有多个关系的 2 个表

问题描述

我有 2 张桌子。一个是员工,另一个是部门。所以第一个关系是一对多的关系,一个员工可以在一个部门工作,但一个部门可以有很多员工。因此,为此,我们将外键放在员工表中。

第二个关系也是一对多关系,尽管它是可选的。这是一种管理关系。因此,一名员工(可选,因为并非每位员工都这样做)可以管理一个或多个部门,但一个部门由一名员工管理。因此,外键在部门中。

create table dept(
    departmentName varchar2(10),
    mgrId integer,
    primary key(departmentName),
    foreign key mgrId references employee(empId)
);

create table employee(
    empId integer;
    empName varchar2(100),
    departmentName varchar2(10),
    primary key(empId),
    foreign key(departmentName) references dept(departmentName));

所以这在技术上是我想要的,但我知道我会得到一个错误,因为我引用的表之一甚至还没有创建。那么我应该只保留一种不是可选的关系吗?还是我应该为经理单独制作一张桌子?

标签: sqloracleforeign-keys

解决方案


您可以先创建两个表,然后添加约束。

然而,这种设计的问题在于,相互依赖不仅会在创建表时引起问题,而且在插入或更新数据时也会引起问题。在进行更新或插入时总是可以暂时禁用约束,但是当需要经常重复时会变得乏味。

为避免这种情况,您可以按照建议创建一个单独的表来处理经理关系。

笔记

甚至可以将员工部门存储在另一个单独的表中,而不是作为员工中的外键。虽然这将为两种关系提供一致的解决方案,但它可能不是一个好的设计选择:正如@APC 评论的那样,强制执行表必须有子表的规则是很棘手的,因此应保留此类表的数量到最低限度。


推荐阅读