2014-01-09 133 views
0

我想就我製作的以下ERD圖表徵詢您的意見。請記住,我還沒有代表關係的基數。實體關係圖銷售

我要做的是:

  • 客戶端中去買車;
  • 該汽車可以升級許多附加值,這些附加值加起來就是汽車的基本價格;
  • 推銷員可以免費提供額外服務,或者爲了吸引客戶而在銷售總價中提供折扣;

您如何看待我的圖?這樣對嗎?你看到有什麼不對嗎?

[編輯]

我怎麼去表示以下情形。作爲購買新車的一部分,顧客向我出售二手車。

+0

只是問...如果折扣出售的總價給出,那麼爲什麼'discount'屬性出現在'OrderDetails'?爲什麼不在'訂單'? – hashbrown

+0

免費提供額外的折扣(100%折扣)。但是,我不知道這是做事的正確方法。 – MossEverett

+0

好的,有道理。但是,如果推銷員想要給整體成本打折呢?你打算如何存儲這些信息? (不知道你的情況是否是一個有效的業務場景) – hashbrown

回答

0

無論您的模型是否正確取決於您的模型是否可以捕獲您上面描述的所有業務場景 - 恕我直言,您的模型做得相當好(祝賀!);除去一些小的異常情況,例如Order實體中沒有Discount屬性來捕獲整體銷售折扣(這是可能的業務情景)。

但是當你像這樣建立模型,你應該考慮這種模式的最終目的:

  • 它是用於捕捉交易數據(OLTP )?
  • 它是用於存儲數據的報告目的(OLAP

在你的情況,我相信你的最終目標是通過對聯機事務處理(OLTP)系統設計來捕捉商業交易。 OLTP模型通常在本質上被歸一化(歸因於標準化的明顯好處,例如減少冗餘,更新/刪除異常預防等)。除了少量傳遞依賴性之外,您的模型大部分都是在3NF表單中。實體Order中的列SalesTotal似乎是可導出的列(基於PriceDiscount,您已經存儲在其他實體中),並且不需要單獨維護(讀取冗餘)。

也是基於以上的評論,

額外的價格變化,在任何給定的點。卜我應該強麥打破 減售不夠看的東西,原來的價格在該日期

我不認爲你可以做到這一點,因爲你Extra實體被設計成存儲當前永遠都是Price。您的OrderDeatils包含任何給定時間點的CarExtra之間的關係。如果以後汽車價格和額外價格發生變化,您將會失去舊價格,因爲您將以新價格更新舊價格。因此,儘管您可以跟蹤OrderDetailsID_Car和​​,但您不知道在訂單創建期間他們的歷史價格是多少。

如果要存儲歷史價格,請考慮在CarExtra之間再添加一個表格,以將過去的價格與日期相比較。

客戶端可以作爲賣方

在當一個客戶端可以作爲賣方行動的情況採取行動,此人將在這兩個你ClientSalesman表獨立存在的......那是完全沒有問題(這樣的設計技術被稱爲垂直分離)。

或者,如果你真的需要一個3NF的模式,那麼你應該創建一個新的實體 - Person包含屬性如nameid等,這Person實體將用於兩個客戶和業務員的細節存儲在技術上的兩他們是某個人,但他們的「角色」是不同的。一旦你有這個Person實體,你可以刪除SalesManClient實體。然後在Order的實體,您已經有了一個Clent IDSalesman ID屬性來定義兩個不同的人之間的關係(這些Clent IDSalesman IDForeign KeyPerson IDPerson實體)。從Order實體可以知道一個人是否扮演推銷員或客戶的角色。

希望這有助於

+0

很好地把@hashbrown。非常明確和清晰。我無法捕捉的一件事情,這是一個明確的似是而非的情景,是一個客戶可以作爲我的立場賣方。我代表這是什麼?我的意思是,而不是我是賣方,隨時可以進來賣給我一輛新車/二手車。 – MossEverett

+0

@MossEverett更新我的上述答案與你提出的點 – hashbrown

+0

@MossEverett如果你喜歡我的回答是,不要忘記'投票'/'接受'這個答案:-) – hashbrown