2013-12-20 36 views
0

我有以下要求:數據庫規範化方案

  1. 一個項目,可以通過一個公司或一個人所擁有。什麼是這個設計問題的一個很好的解決方案?

第一種方法是在Project表中包含對Person和Company表的引用。但加入的問題很難管理。

在我的工作場所中使用的第二種方法是使用EntityType和EntityId,其中EntityType可以是(1 =公司或2 = Person),EntityId是指相應表中的記錄標識。我可以看到,這種方法仍然是一個問題,因爲它需要在加入這些表後進行聯合。由於項目是我的關鍵實體之一,我可以看到這是一個非常昂貴的例程。

我有興趣找出是否有更好的方法來解決這個設計問題?

+0

您可以使用鑑別器列和值 – wxyz

+1

我們在談論多少公司和個人? – PeterRing

+0

它只能是1所有者,無論是公司還是個人 – Purusartha

回答

1

從純粹的SQL看來,我會用下面去:

Projects 
- ProjectID 
- OwnerID -> references ProjectOwners.OwnerID 

ProjectOwners 
- OwnerID (identity and PK) 

Company -> inherits from ProjectOwners 
- CompanyID (PK and FK to ProjectOwners) 

People -> inherits from ProjectOwners 
- PersonID (PK and FK to ProjectOwners) 

這樣的設計可以讓你保持充分RI。缺點是任何聯接都會涉及更多的表,這會影響性能。

0

我只是用ID代理鍵創建一個EntityTable。
然後將具有EntityID FK
的公司和人員表格填入此表中。你並不需要EntityType列,
你可以從Person到EntityTable進行內聯接;如果您發現
沒有行,那麼它是公司,而不是人(反之亦然)。
但是這是主觀的,我不確定是否沒有任何更好的做法

2

設計一個新表OwnerType。這可以有行individualcompany。 現在包含從表OwnerTypeProjectOwner的引用表&在項目表中包含組合鍵。 Sample Schema

+0

假設業主本身並沒有不同的屬性,這比我的清潔工更清潔。 – Liath

+0

在Damiens設計中,項目業主似乎包括公司和個人,這不完全是我的場景。但謝謝你的建議 – Purusartha