映射多对多关系

use*_*594 9 mysql database-design many-to-many

我有两个表:

  1. Employee 表,包含employee_id(主键)和employee_name 列。
  2. 包含 company_id(主键)和 company_name 列的公司表。

这些公司允许其员工为其他公司工作。所以一个员工可以在很多公司工作,一个公司可以有很多员工(多对多关系)。

假设我有 3 名员工和他们工作的公司,分别具有一天的开始和结束时间。

employee_name | company_name | hours they work |
Akash            A               09:00 - 11:00                            
                 B               12:00 - 02:00                       
                 C               04:00 - 07:00  

Sunny            D               09:00 - 11:00
                 C               12:00-  04:00
                 D               05:00 - 07:00 

Vishal           B               09:00 - 12:00 
                 A               12:00 - 05:00
Run Code Online (Sandbox Code Playgroud)
  • 我应该如何设计数据库?
  • 我如何找到给定公司工作时间最长的员工?

ukl*_*kll 15

您将同时拥有员工表和公司表来存储员工和公司信息。但是您需要另一个表来表示关系,因为它是多对多关系。

同样在这里,工作时间信息是一个关系属性。直到员工开始为公司工作时,它才存在。

ER图将简单如下: er图

当您映射此关系时,您将有一个表 company_employee(employee_id, company_id, work_hours)

表的 SQL 代码:

CREATE TABLE employee (
    employee_id INTEGER PRIMARY KEY,
    employee_name VARCHAR(100) NOT NULL
);

CREATE TABLE company (
    company_id INTEGER PRIMARY KEY,
    company_name VARCHAR(300) NOT NULL
);

CREATE TABLE company_employee (
    employee_id INTEGER NOT NULL,
    company_id INTEGER NOT NULL,
    work_hour_start TIME NOT NULL,
    work_hour_end TIME NOT NULL,
    FOREIGN KEY (employee_id) REFERENCES employee (employee_id) ON DELETE RESTRICT ON UPDATE CASCADE,
    FOREIGN KEY (company_id) REFERENCES company (company_id) ON DELETE RESTRICT ON UPDATE CASCADE,
    PRIMARY KEY (employee_id, company_id, work_hour_start, work_hour_end)
);
Run Code Online (Sandbox Code Playgroud)

在 company_employee 表中,您也可以根据需要将工作时间存储在单个列中。

要查看列,

SELECT e.employee_name, c.company_name, ec.work_hour_start, ec.work_hour_end
FROM employee e
INNER JOIN company_employee ec
ON e.employee_id = ec.employee_id
INNER JOIN company c
ON c.company_id = ec.company_id;
Run Code Online (Sandbox Code Playgroud)

最后,这将显示谁为哪家公司工作了多少小时:

SELECT c.company_name, e.employee_name, MAX(ec.work_hour_end - ec.work_hour_start) AS max_hours
FROM employee e
INNER JOIN company_employee ec
ON e.employee_id = ec.employee_id
INNER JOIN company c
ON c.company_id = ec.company_id
GROUP BY c.company_name, e.employee_name
ORDER BY c.company_name;
Run Code Online (Sandbox Code Playgroud)