【问题标题】:One employee can work in many hotels and one hotel can have many employees?一个员工可以在多个酒店工作,而一个酒店可以有多个员工?
【发布时间】:2013-10-05 18:05:57
【问题描述】:

我需要在我的Oracle 数据库中的EmployeesHotels 表之间创建一个相交表:

一个Employee 可以在多个Hotels 中工作,一个Hotel 可以有多个Employees

我认为我可能会不必要地混淆自己。

首先,我首先在Employees 表中的Employee-Hotel-ID 列和Hotels 表中的Hotel-ID 列之间创建一个FK

但后来我意识到这不允许很多员工在很多酒店工作。

【问题讨论】:

  • 好的 - 所以你需要 1) 一张员工表,2) 一张酒店表和 3) 第三张“WorksAt”表来代表你的 N::N 关系。
  • 我第二个 paulsm4:s 评论。您正在寻找的是一个 Junction 表:en.wikipedia.org/wiki/Junction_table 只是一个小小的修正,它不是一个 n:n 关系,而是一个 m:n 关系。联结表通常是通过让一个表只有 2 个带有 FK 的主键来完成的。
  • "m:n" 是绝对正确的 :) 并且“连接表”通常会包含其他信息,例如班次# 或工资率(不同酒店的不同员工可能会有所不同)。跨度>
  • 感谢您的回复。在这种情况下,我是否将hotelID 和employeeID 作为PK 添加到WorksAt 表中,并将外键添加到相应的表中?
  • @paulsm4,您愿意创建一个简单的连接表作为正式答案吗? (因为你是要回答的人)

标签: database oracle data-modeling


【解决方案1】:

关系数据库本身无法处理多对多关系。标准方法是创建一个中间表,其中包含其他两个表的外键。

类似:

create table hotel_employee (
    hotel_id int,
    employee_id int
);

此类表通常称为关联表。

【讨论】:

  • 谢谢,中间表的hotelID和employeeID应该都是PK的吧? ...然后当然 FK 对应于您提到的其他表。
【解决方案2】:

使用 en.wikipedia.org/wiki/Junction_table 中的方言,我们有:

CREATE TABLE Hotels (
    hotel_id INTEGER PRIMARY KEY,
    ...
)

CREATE TABLE Employees (
    employee_id INTEGER PRIMARY KEY,
    ...
)

-- This is the junction table.
CREATE TABLE WorksAt (
    hotel_id INTEGER REFERENCES Hotels (hotel_id),
    employee_id INTEGER REFERENCES Employees (employee_id),
    PRIMARY KEY (hotel_id, employee_id)
)

【讨论】:

    【解决方案3】:

    1) 正如我们所讨论的,您需要

    • 员工表,
    • 酒店和桌子
    • 第三个“WorksAt”表表示您的 M:N 关系(“多对多”关系)。

    2) “WorksAt”表将包含 EmployeeID 和 Hotel ID 的 FK。它可能包含特定于该特定关系的其他信息,例如该酒店的该员工的“班次#”。

    3) 这是一个很好的讨论:

    【讨论】:

    • 我很高兴:很高兴它有帮助。如果您愿意,请随时“接受”答案。
    猜你喜欢
    • 2020-02-25
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 2010-09-14
    • 1970-01-01
    • 2020-11-16
    • 2016-03-29
    相关资源
    最近更新 更多