2014-12-06 152 views
0

我必須設計一個數據庫。我正在尋找實體及其關係。但是每個關係似乎都有多對多的關係。舉例來說,在我的情況:如何區分設計數據庫時的多對多關係?

1)員工管理客戶端

這裏員工可以管理零個或多個客戶端。同樣,客戶端由一個或多個客戶端管理。

2)客戶下單購買股票

這裏客戶可以訂購零,一個或更多的股票買入和股票可以通過零,一個或多個客戶訂購。

3)客戶訂單賣出股票

這裏客戶可以訂購零,一個或更多的股票出售和股票可以通過零,一個或多個客戶訂購出售。

這些是我的情況的一些例子。我很困惑如何區分這些關係。在我的場景中還有其他很多類似的情況。而且我很難概念化設計。

所以,請賜教我關於我的情況。

回答

0

這似乎有很多你正在開發的系統,可能有你沒有提到的要求,所以它是不可能拿出一個完整的答案。但希望下面的一些內容能幫助你在描述時「設計概念化」。

1)這是一種非常常見的情況,有很多處理這些多對多關係的標準方法。

如果有2個實體A和B具有多對多關係,那麼您通常會引入一個由2列組成的實體C--一個是A的唯一ID的外鍵,另一個是外鍵到B的唯一ID。並且您將刪除實體A中指向B的外鍵列,反之亦然。

i。Ë

|-----| 
| A | 
|-----| 
    \|/ 
    | 
    | 
    /|\ 
|-----| 
| B | 
|-----| 

變爲:

|-----| |-----| 
| A | | B | 
|-----| |-----| 
    |  | 
    |  | 
    |  | 
    /|\  /|\ 
|-------------| 
|  C  | 
|-------------| 

的主要挑戰是什麼經常稱這些新的實體!有時他們可能只是像a_b_relationship,但如果能識別更有意義的名字是很好的。

2)看起來你需要做更多的分析來識別所有的實體。這樣做的一種方法是通過對系統的描述並識別名詞 - 通常如果描述中有名詞,則適合在實體 - 關係圖中包含實體。

「Order」作爲您忽略的名詞跳出。

通常對於訂單處理,您將有2個實體 - 包含日期,總價值,客戶等的訂單以及標識訂購了多少產品以及單個價格的子訂單行。所以在電子商務中,購物車就是訂單,而購物車中的每件商品都是訂單記錄。

在您的情況,我們就會有:

|----------|   |-----------| 
| client |   | product | 
|----------|   |-----------| 
     |      | 
     |      | 
     |      | 
    /|\      /|\ 
|-------------|  /|-------------| 
| order |--------| orderline | 
|-------------|  \|-------------| 

3)客戶銷售各類產品

在這裏,你要識別客戶端的其他角色,什麼我在這裏做的是問題,即是否「客戶「在這個階段是一個合適的實體。您可能會發現在「買方」和「賣方」方面進行思考比較容易,直到理解了首次設計。如果買賣雙方有很多共同點(特別是如果一個人既可以是買方也可以是賣方),那麼您最終可能決定使用單一實體。您的ERD工具可能會爲此提供支持 - 搜索「子類型實體」或「實體子類型」。

細節將取決於您的實際應用,但可能是每個訂單行應與賣方有關係,並且訂單與買方的關係。這將取決於例如買方是否有可能訂購特定產品的多個項目,其中一些來自一個賣方而另一個來自另一個賣方。它可能變得複雜!

此外,考慮是否需要在銷售之前記錄賣家的股票可能會有所幫助。這裏區分「產品」和「庫存」可能是有用的,例如

|---------| |-----------| 
| seller | | product | 
|---------| |-----------| 
    |   | 
    |   | 
    |   | 
    /|\   /|\ 
|-----------------| 
|  stock  | 
|-----------------| 

作爲一般性評論,我會說它真的可以幫助逐步完成設計過程。因此,一旦獲得了初始模型,將需要存儲的所有數據項分配給適當的實體,並有條不紊地確保設計處於第一範式,然後是第二範式,然後是第三範式。只有一旦你完成了這個任務,並且確信設計反映了需求,你應該考慮如何在數據庫中實現設計。無論如何,這就是我多年前學到的東西!

0

這很難回答這個問題。設計中的一切都是情境化的。如果你確實需要存儲哪些員工管理客戶,而客戶可以由很多員工管理,那麼你的關係是多對多的。注意現實世界中的實體之間有很多關係;你應該只存儲它們中哪些是重要的和必要的存儲。另外一個例子,如果你的股票包含這種商品的可用數量,那麼客戶和股票之間的關係也是多對多的。

注意:請勿使用複數形式的名詞作爲表名,否則會導致您對關係感到困惑。

編輯:要在數據庫表中應用多對多關係,您需要一箇中介表。例如,關於客戶和產品表,您應該創建一個名爲CustomerProduct(或您想要的一切)的表。 CustomerProduct表包含兩個外鍵,一個來自Customer表,另一個來自Product表。通常(並非全部)一個多對多的關係分解爲兩個多對一的關係。 看到這個Link

+0

有一個客戶誰可以購買許多不同的產品和可以由許多不同的客戶購買的產品表客戶表。那麼,如何在數據庫設計中不允許多對多關係的情況下將其分解。 – user3127109 2014-12-06 07:07:48

+0

@ user3127109:這是不同的問題,我編輯了我的答案。請閱讀編輯部分。 – 2014-12-06 09:10:38