2011-07-29 3 views
0

J'ai le problème suivant que je dois exprimer.Conception de la base de données - Modèle de relation d'entité

Il existe des personnes, des lieux de travail et des sites. Chaque personne peut être affectée à plusieurs lieux de travail. Chaque lieu de travail peut avoir plusieurs personnes. Chaque lieu de travail a exactement un site. Jusqu'ici tout va bien. Mais mon problème est que chaque personne n'a qu'un seul lieu de travail sur un site spécifique. Comment puis-je l'exprimer dans un ERM?

Mon idée à ce jour:

idea

Je ne peux pas exprimer la « personne n'a qu'un seul lieu de travail sur un site spécifique » -problem avec cette approche.

Solution de mise en œuvre:

Table Person with Prs_ID (PK) 
Table Site with Site_ID (PK) 
Table Workplace with Plc_ID (PK) 
Table Person_Site with Prs_Site_PrsID (PK, FK), Prs_Site_SiteID (PK, FK), Prs_Site_PlcID (FK) 
Unique Index on Prs_Site_PlcID 

Je pense que cela devrait résoudre le problème. Maintenant, comment puis-je exprimer cela dans un ERM?

Edit:

Je pensais que ce serait résoudre le problème, mais il ne fonctionne pas. Avec ceci je ne peux pas assigner un lieu de travail à deux personnes différentes, parce qu'il y a un index unique sur la colonne de Prs_Site_PlcID. Retour au début ...

+1

S'il vous plaît poster votre meilleure estimation afin que nous puissions commenter et suggérer des améliorations. Ce n'est pas 'do_my_work_for_me.com'. –

Répondre

2

enter image description here

Remarque index unique Ak1 (autre touche) (SiteID, WorkplaceID) sur Workplace qui se propage à PersonWorkplace.

-- 
-- PostgreSQL 
-- 
create table Site  (SiteId  integer not null); 
create table Person (PersonId integer not null); 
create table Workplace (WorkplaceID integer not null, SiteID integer not null); 
create table PersonWorkplace 
(PersonID integer not null, SiteID integer not null, WorkplaceID integer not null); 

alter table Site add constraint pk_Sit primary key (SiteID); 
alter table Person add constraint pk_Prs primary key (PersonID); 

alter table Workplace 
    add constraint pk_Wpl primary key (WorkplaceID) 
, add constraint fk1_Wpl foreign key (SiteId) references Site (SiteId) 
, add constraint ak1_Wpl unique (SiteID, WorkplaceID); 

alter table PersonWorkplace 
    add constraint pk_PrsWpl primary key (PersonId, SiteID) 
, add constraint fk1_PrsWpl foreign key (PersonId) references Person (PersonID) 
, add constraint fk2_PrsWpl foreign key (SiteID, WorkplaceID) references Workplace (SiteID, WorkplaceID); 
+0

J'aime vraiment cette solution et je ne peux pas voir un défaut jusqu'à présent. Je vais essayer lundi et revenir à vous. Merci! – Aurril

+0

Cela fonctionne comme prévu. – Aurril

+0

@Auril, vous pouvez également enregistrer un index si vous placez SiteID dans PK de la table Workplace et utilisez 'SiteWorkplaceNo' (int, 1,2,3 ... pour chaque site) au lieu de' WorkplaceID' –

0

Vous avez besoin d'une table intermédiaire EMPLOYÉS qui représente le passage d'une PERSONNE sur un chantier travaillant pour un employeur. Une seule personne peut avoir plusieurs employés, c'est-à-dire travailler pour plus d'un employeur. Travail de jour/travail de nuit, ou emplois successifs. L'EMPLOYÉ n'est pas un synonyme de l'entité personne mais est une représentation de la personne à l'employeur.

+0

Toutes les personnes ont le même employeur, juste qu'elles peuvent être sur des sites différents. – Aurril

1

Je pense que l'indice est dans la question.

Vous dites que chaque lieu de travail a un site - les relations sont donc:

beaucoup de personnes ont de nombreux lieux de travail

Un lieu de travail a un site;

suggestion de mise en œuvre:

Person table 
----------- 
person_id primary key 
..... 

Workplace table 
-------------- 
workplace_id primary_key 
site_id (unique index) 

person_workplace table 
------------------- 
person_id 
workplace_id 

site table 
-------------- 
site_id primary key 

L'index unique sur la colonne site_id dans la table de travail veille à ce que chaque lieu de travail est associé à un autre site.

+0

Cette conception permettrait d'attribuer 2 lieux de travail à une personne et les deux lieux de travail sont sur le même site. – Aurril

+0

Dans ce cas, vous pouvez créer un index unique dans la colonne clé étrangère du lieu de travail. –

+0

L'index unique empêcherait 2 personnes partageant le même lieu de travail. Mais c'est possible dans mon scénario. – Aurril

Questions connexes