连接/桥接表Oracle SQL

ado*_*tyd 1 sql oracle foreign-key-relationship junction-table

关于Oracle SQL中的连接表的快速问题.我理解他们的功能和他们在"多对多"关系中的角色,但是"一对多"关系呢?我有两张桌子,EmployeesPositions.每个员工只能持有一个职位,但每个职位可以有很多员工.例如,John Doe只能是销售主管,但公司有4名销售主管.这是我到目前为止编码的方式:

CREATE TABLE Positions (
position_id NUMBER(2) NOT NULL,
position_name VARCHAR2(25) NOT NULL,
CONSTRAINT pk_position PRIMARY KEY(position_id)
);

CREATE TABLE Employee (
emp_id NUMBER(3) NOT NULL,
emp_name VARCHAR2(30) NOT NULL,
emp_position NUMBER(2) NOT NULL,
emp_salary NUMBER(5) NOT NULL,
CONSTRAINT pk_employee PRIMARY KEY(emp_id),
CONSTRAINT fk_emp_pos FOREIGN KEY (emp_position) 
REFERENCES Position(position_id)
);

CREATE TABLE pos_emp (
position_id NUMBER(2) NOT NULL,
emp_id NUMBER(3) NOT NULL,
CONSTRAINT pk_pos_emp PRIMARY KEY(position_id, emp_id)
);
Run Code Online (Sandbox Code Playgroud)

它是否正确?是否需要:
a.Employee表中的外键?
湾 联结表?

我想在员工表中强制执行一个员工到一个角色关系,同时能够在联结表中将一个角色与多个员工关系联系起来.

希望这是有道理的

Ari*_*ion 5

你建立的关系是多方关系.所以,如果你想要一对多.然后最常见的方法是跳过pos_emp并直接输入外键 Employee.这样表看起来像这样:

CREATE TABLE Employee (
emp_id NUMBER(3) NOT NULL,
emp_name VARCHAR2(30) NOT NULL,
emp_position NUMBER(2) NOT NULL,
emp_salary NUMBER(5) NOT NULL,
position_id NUMBER(2) NOT NULL,
...
Run Code Online (Sandbox Code Playgroud)

编辑

我在我的代码中设置了我的员工表.将Employee表中的Position_id作为外键是否足以强制执行每个拥有多名员工的职位?

如果position_idEmployee不允许null的情况下,则无法添加没有职位的员工.这意味着如果您尝试插入没有职位的员工,您将获得异常,即外部关系不满足.

但是您需要在代码中检查它,以便在添加Employee时position_id具有值.因此,如果没有值,则不要将插入发送到该数据库.因为这是一个不必要的数据库调用.

另一个有趣的观点是,如果删除一个应该发生什么Employee?你应该删除Employee与该职位相关的人吗?如果答案是肯定的.您可能会考虑从位置表中删除级联.否则你可能需要一个触发器.