web-dev-qa-db-fra.com

Cartographie de la relation plusieurs-à-plusieurs

J'ai deux tables:

  1. Table des employés avec les colonnes id_employé (clé primaire) et nom_employé.
  2. Table de société avec les colonnes company_id (clé primaire) et company_name.

L'entreprise permet à son employé de travailler pour d'autres entreprises. Ainsi, un employé peut travailler dans de nombreuses entreprises et une entreprise peut avoir de nombreux employés (relation NOMBREUX À NOMBREUX).

Disons que j'ai 3 employés et les entreprises pour lesquelles ils travaillent avec l'heure de début et de fin respective d'une journée.

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
  • Comment dois-je concevoir la base de données?
  • Comment trouver l'employé qui a travaillé le plus d'heures pour une entreprise donnée?
8
user4946127

Vous aurez à la fois la table des employés et la table de l'entreprise pour stocker les informations de l'employé et de l'entreprise. Mais vous avez besoin d'une autre table pour la relation, car il s'agit d'une relation plusieurs-à-plusieurs.

Ici aussi, les informations sur les heures de travail sont un attribut de relation. Il n'existe que lorsqu'un employé commence à travailler pour une entreprise.

Le diagramme ER sera simplement le suivant: er diagram

Lorsque vous mapperez cette relation, vous aurez une table company_employee (employee_id, company_id, work_hours)

Votre code SQL pour les tables:

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

Dans la table company_employee, vous pouvez également stocker les heures de travail dans une seule colonne, en fonction de vos besoins.

Pour afficher les colonnes,

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;

Enfin, cela montrera qui a travaillé combien d'heures pour quelle entreprise:

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;
13
ukll