2011-07-29 103 views
0

我有以下需要表達的問題。數據庫設計 - 實體關係模型

有人,工作場所和網站。每個人都可以分配到多個工作場所。每個工作場所可以有多個人。每個工作場所只有一個站點。到現在爲止還挺好。但我的問題是,每個人在特定的地點只有一個工作場所。

我該如何在ERM中表達這一點?

我到目前爲止的想法:

idea

我只是無法表達「一人具有在特定的網站只有一個工作場所」 - 問題這種方法。

實現方案:

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(候補鍵)(SiteID, WorkplaceID)Workplace,其被傳播到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

我真的很喜歡這個解決方案,至今我看不到一個缺陷。我會在星期一嘗試並回到你身邊。謝謝! – Aurril

+0

它按預期工作。 – Aurril

+0

@Auril,如果您將SiteID拉入Workplace表的PK並使用SiteWorkplaceNo'(int,1,2,3 ...;對於每個站點)而不是'WorkplaceID',則還可以保存一個索引 –

0

你需要一箇中間表EMPLOYEES,它表示一個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 

在工作場所表中的列SITE_ID唯一索引確保每個工作場所與不同的部位有關。

+0

這種設計可以將2個工作場所分配給一個人,兩個工作場所都在同一個場所。 – Aurril

+0

在這種情況下,您可以在工作場所的外鍵列上創建唯一索引。 –

+0

獨特的索引將阻止2人共享相同的工作場所。但是在我的情況下這是可能的。 – Aurril