2011-07-29 2 views
0

다음과 같은 문제점이 있습니다.데이터베이스 디자인 - 엔티티 관계 모델

사람, 직장 및 사이트가 있습니다. 각 사람은 여러 작업장에 배정 될 수 있습니다. 각 직장에는 여러 명이있을 수 있습니다. 각 작업장에는 정확하게 하나의 사이트가 있습니다. 여태까지는 그런대로 잘됐다. 그러나 제 문제는 각 개인이 특정 사이트에서 단 하나의 직장 만 갖고 있다는 것입니다.

ERM에서 어떻게 표현할 수 있습니까? 지금까지

내 생각 : 난 그냥 표현할 수

idea

이 방법 -problem "한 사람이 특정 사이트에 하나의 작업장이있다."

구현 솔루션 :

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 

나는이 문제를 해결한다고 생각합니다. 이제 어떻게 이것을 ERM에서 표현할 수 있습니까?

편집 : 나는이 문제를 해결할 것이라고하지만, 그렇지 않은 생각

. 이 때문에 Prs_Site_PlcID 열에 고유 한 인덱스가 있기 때문에 하나의 작업 공간을 두 명의 다른 사람에게 할당 할 수 없습니다. 처음으로 돌아 가기 ...

+1

의견을 게시하고 개선을 제안 할 수 있도록 최선을 올려주세요. 이것은'do_my_work_for_me.com'이 아닙니다. –

답변

2

enter image description here

참고 고유 인덱스 Ak1 (대체 키) PersonWorkplace에 전파됩니다 Workplace(SiteID, WorkplaceID).

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

나는이 해결책을 정말 좋아하고 지금까지 결함을 볼 수 없다. 나는 월요일에 그것을 시도 할 것이고 당신에게 되돌아 올 것이다. 감사! – Aurril

+0

예상대로 작동합니다. – Aurril

+0

@Auril의 경우 Workplace 테이블의 PK에 SiteID를 가져오고 각 사이트에 대해 'SiteWorkplaceNo' (int, 1,2,3 ...;)를 사용하면 하나의 인덱스를 저장할 수도 있습니다. –

0

고용주를 위해 일하는 직장에서 피고용자의 자격을 나타내는 중간 테이블 직원이 필요합니다. 한 사람이 여러 명의 고용인이 될 수 있습니다. 즉, 한 명 이상의 고용주가 있습니다. 주간/야간 직무 또는 직무 연속. EMPLOYEE는 person 엔티티의 동의어가 아니지만 고용주의 대표입니다.

+0

모든 사람은 다른 위치에있을 수 있다는 것과 동일한 고용주를 가지고 있습니다. – Aurril

1

실마리가 궁금합니다.

당신은 각각의 작업 장소가 하나 개의 사이트에서이 말 - 따라서 관계를 다음과 같습니다

많은 사람이 많은 직장

한 사업장이 하나 개의 사이트가;

구현 제안 :

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 

직장 테이블의 사이트 ID 컬럼의 고유 인덱스는 각 사업장이 다른 사이트에 연결되어 있는지 확인합니다.

+0

이 설계는 한 사람에게 2 개의 작업 공간을 할당하고 두 작업 공간 모두 같은 사이트에 배치 할 수있게합니다. – Aurril

+0

이 경우 직장의 외래 키 열에 고유 한 인덱스를 만들 수 있습니다. –

+0

고유 색인은 동일한 작업 환경을 공유하는 2 인을 방지합니다. 그러나 이것은 내 시나리오에서 가능합니다. – Aurril