【问题标题】:Junction/Bridge tables Oracle SQL连接/桥接表 Oracle SQL
【发布时间】:2012-05-13 02:47:57
【问题描述】:

关于 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)
);

这是正确的吗?是否需要:
一种。 Employee 表中的外键?
湾。接线表?

我想在员工表中强制执行一个员工对一个角色的关系,同时能够在联结表中拥有一个角色对多个员工的关系。

希望这是有道理的

【问题讨论】:

    标签: sql oracle foreign-key-relationship junction-table


    【解决方案1】:

    您建立的关系是多对多关系。因此,如果您想要一对多。那么最常用的方法就是跳过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,
    ...
    

    编辑

    我在我的代码中设置了这样的员工表。将拥有 Employee表中的position_id作为外键就足够了 强制每个职位有很多员工?

    如果Employee 中的position_id 不允许nulls,则您无法添加没有职位的员工。这意味着,如果您尝试插入没有职位的 Employee,您将得到一个异常,即外部关系不满足。

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

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

    【讨论】:

    • 我在我的代码中设置了这样的员工表。将Employee 表中的Position_id 作为外键是否足以强制每个职位有很多员工?
    • @adohertyd :更新了答案
    猜你喜欢
    • 1970-01-01
    • 2016-07-18
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 2015-02-26
    • 1970-01-01
    相关资源
    最近更新 更多