2013-12-10 38 views
5

在我的業務邏輯中,我有一個用戶,一個公司(用戶可以是公司的一員,作爲員工,我會稱他們爲「代理人」)和產品。設計一個數據庫來跟蹤店主

產品可以由用戶或公司擁有,公司可以稍後將其分配給用戶(代理商),但它仍然歸公司所有(以防公司觸發代理商)。

我的想法是讓用戶表,公司表和產品表和表來跟蹤誰是產品的所有者:

-------------- 
| users | 
-------------- 
| user_id | 
| name  | 
-------------- 
-------------- 
| products | 
-------------- 
| product_id | 
| title  | 
-------------- 
-------------- 
| company | 
-------------- 
| company_id | 
| name  | 
-------------- 

-------------- 
| agents | 
-------------- 
| agent_id | 
| user_id | 
| company_id | 
-------------- 

---------------- 
|product_owner | 
---------------- 
|  id  | 
| product_id | 
| user_id  | 
| company_id | 
|agent_assigned| 
---------------- 

如果產品被用戶所擁有則只product_id和user_id將被填充。如果它由公司擁有,則product_id,company_id和agent_assigned將被填充。後來,我想拉一個產品,並知道誰是所有者:用戶信息或代理和公司信息。

這是最好的方法嗎?這對我來說並不好。

+0

我們有一個聯繫人數據庫。每個聯繫人都必須屬於(至少)一個組織,但其中一些組織有點抽象 - 例如'項目x客戶羣'。因此,在您的情況下,即使某些組織在某種意義上是虛構的,每個產品都將歸組織所有。這個問題並沒有嚴格符合SO的要求,但無論如何,我還是把它提高了一點,因爲我喜歡它。 – Strawberry

+0

無需在product_owner中存儲company_id - 此信息已保存在代理表中。另一種可能性是將owner_id始終存儲在同一個字段中,並添加另一個定義所有者類型的字段 – niyou

+0

爲什麼不能:Owner_type,Owner_ID,slave_type,slave_ID。只是在那裏衝擊每一個可能的關係。這樣一切都可以以同樣的方式處理,您也可以將項目分配給多個所有者。 OT ='company',OI = company_id_2,ST ='product',SI = product_id_25 – Viridis

回答

0

使用標準Party Model。請閱讀Table繼承來實現它。

資產由法定方所有。它可以是個人,一羣人(瓊斯家族),政府,公司。您需要將這些具體類型抽象爲一種抽象類型,以便您可以將單個外鍵指向它們。

0

根據您的要求,我不認爲您太遙遠。當你需要拉一個產品,找到你只需要一個連接查詢的所有者然後

enter image description here

:我會分離屬於公司和用戶。然而,在產品,使之成爲這樣的事情。這樣的事情:

select * from product p 
left join companyproduct cp on p.id = cp.product 
join productowner po on cp.productid = po.productid 
join agent a on po.userid = a.userid 
where p.id = ? AND a.userid = ? 

我並不是說語法是正確的或將爲你工作,它只是你需要做的一個例子。

+0

這個解決方案的意義在於ProdcutOwner只有一個用戶標識。如果公司「發射」了該代理,該怎麼辦?然後該產品將沒有所有者。我想保留公司作爲產品的所有者,即使我解僱了代理 – raygo

+0

您描述它的方式,您會在'ProductOwner'頁面的'userid'中使用默認值'NULL'?這是一個糟糕的設計,這就是爲什麼我選擇將它們分成「ProductOwner」和「CompanyOwner」的原因。如果代理人被解僱,那麼'ProductOwner'中的記錄就可以被刪除,而您將在'CompanyProduct'中保留哪個公司擁有該產品的記錄。至少,這就是我對設計的看法。 – Dan

+0

好的。我可能有點困惑。那麼,如果我想知道產品是由用戶,代理商還是公司所有,那麼我必須先查看CompanyProducts,然後再查看ProductOwner嗎?感謝您的幫助btw – raygo