sql - 如何连接具有多个关系的 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));
所以这在技术上是我想要的,但我知道我会得到一个错误,因为我引用的表之一甚至还没有创建。那么我应该只保留一种不是可选的关系吗?还是我应该为经理单独制作一张桌子?
解决方案
您可以先创建两个表,然后添加约束。
然而,这种设计的问题在于,相互依赖不仅会在创建表时引起问题,而且在插入或更新数据时也会引起问题。在进行更新或插入时总是可以暂时禁用约束,但是当需要经常重复时会变得乏味。
为避免这种情况,您可以按照建议创建一个单独的表来处理经理关系。
笔记
甚至可以将员工部门存储在另一个单独的表中,而不是作为员工中的外键。虽然这将为两种关系提供一致的解决方案,但它可能不是一个好的设计选择:正如@APC 评论的那样,强制执行表必须有子表的规则是很棘手的,因此应保留此类表的数量到最低限度。
推荐阅读
- r - 如何使用 dplyr 在数据框中将每日数据分组为月份
- r - 在 R 中加入绝对和相对 URL
- python - 使用 Pygame 加载更新的图像
- php - 当我知道它是正确的时,PHP 脚本说“密码无效”
- xml - 如果值存在于另一个 xml 列表中,则过滤 XML 记录
- android - android - BOOT_COMPLETED 在 android 7.1 及以下版本中不起作用
- python - 无法从网页中获取所有图像
- javascript - 如何在不使用全局变量的情况下使此功能正常工作
- javascript - 使用 Angular Http Headers 发送凭据数据的正确方法是什么?
- bash - 作为文件名输出的变量字符串