2012-04-30 99 views
2

我敢肯定之前會問這個,但是我很困惑!數據庫設計閱讀材料

說我有一個SQL Server數據庫,其中包含以下表

enter image description here

和資料...

INSERT [dbo].[Organisation] ([id], [name]) VALUES (1, N'ABC Ltd') 
INSERT [dbo].[Organisation] ([id], [name]) VALUES (2, N'XYZ Ltd') 

INSERT [dbo].[Employee] ([id], [name], [organisationId]) VALUES (1, N'Dave', 1) 

INSERT [dbo].[Message] ([id], [text], [employeeId], [created]) VALUES (1, 'My 1st message', 1, '2012 01-01 00:00:00') 
INSERT [dbo].[Message] ([id], [text], [employeeId], [created]) VALUES (2, 'My 2nd message', 1, '2012 01-02 00:00:00') 
INSERT [dbo].[Message] ([id], [text], [employeeId], [created]) VALUES (3, 'My 3rd message', 1, '2012 01-03 00:00:00') 

所以,我們可以看到,戴夫,一個人的作品ABC有限公司已連續3天創建了3條消息。世界上一切都很好。

如果事實證明,戴維從來沒有爲ABC公司,但實際上適用於XYZ公司這很好,我們改變了組織ID,就是這樣。

什麼,但是,我應該做的,如果他做工作,爲ABC,但後來改爲XYZ有限公司2012-01-02。

的任何報告要求多少消息是由每個組織提出的將,如果運行一天,我們改變戴夫斯organisationId之前,顯示了ABC 100%和100%的XYZ後,如果運行的日子。錯,錯,錯!

我的問題是不是有人來解決這個難題,但指向我的,我可以看,可以幫助我對象的方向。

我今天一直在搜索以下術語「數據倉庫」,「基於時間的系統」和「時間數據庫」,並閱讀了一些非常令人困惑的文章(對我感到困惑,我確信它們是很棒的文章)。

那麼,有沒有人可以幫助我通過正確的方向推動我?我相信你可以從這個消息中收集到我需要一個「傻瓜式」指南給這個主題.....無論這個主題是什麼!

乾杯。

回答

1

但是,如果他爲ABC工作,但是在2012-01-02更改爲XYZ有限公司,我該怎麼辦?

你剛纔定義一個多對多的關係。員工可以爲多個組織工作,而組織有多個員工。

開始與Data Normalization這個維基百科文章。在Google圖片中搜索「多對多關係」。這些圖像會帶給你一些很好的解釋。

0

如果您需要按時間報告,那麼您需要以這種方式存儲數據。因此,不要將這些視爲標準化表格,您需要做的就是將它們視爲查找表格,然後將所需的值存儲在消息表格中。

隨着時間的推移數據發生變化,這不是非規範化。例如,如果我有一條消息,需要知道哪個組織發送了它,哪個員工發送了它,那麼我需要將這兩個消息存儲在消息表中,而不是回覆員工與組織之間的連接(我可能需要要知道其他的東西。)

對於一些事情,你甚至不希望id字段存儲在決賽桌,但實際的文本數據。因此,如果您需要報告郵件發送時候的郵政組織名稱(或人員),您可能需要在郵件表中存儲員工姓名和組織名稱以及ID。這似乎不太可能與消息比其他一些事情,所以讓我舉個例子,你有一個訂單應用程序。在訂單明細表中,您不想只存儲part_number,但您也想存儲零件的名稱(這可能隨時間而改變,但當客戶有問題時,他會查看您的文書工作當時送給他)和價格(這幾乎肯定會隨着時間的推移而變化)以及其他細節。您可能還想將PK存儲到零件中,以便您現在可以輕鬆查找並查看替換件可能需要多少成本。

0

我看過這個問題多年來出現過多次。這是一個沒有認識到「這正是Dave現在(或者我們最後一次檢查)工作的地方」是一種不同的關係,「這是戴夫工作歷史的一部分」。工作歷史關係是有狀態的,因爲每個關聯都有一個開始日期和可空的結束日期。我第一次看到這種設計模式是健身俱樂部會員制。

很明顯,您不希望使用「Dave現在正在工作」的關係來查詢消息數據。我可以想出解決當前問題的兩種方法:或者直接將公司信息與公司聯繫起來,或者按照工作歷史記錄來推導公司。在實踐中,我已經看到後一種方法過於複雜;如果你決定走這條路,那麼確保你從關注的數據中獲得了一些東西。當然你應該考慮採取簡單的解決方案,並捕獲你知道你關心的直接消息/公司關係。這也將照顧戴夫正在進行月光照明的情況。

0

下面是這種情況的模型非常簡單的方法:

enter image description here

從本質上講,你是綁在消息未給員工(的人),但對就業的特定時期。這工作正常假設:

  • 失業的人不能關聯到一條消息。
  • 您很滿意在應用程序級別實施時間關係。例如,Message.Created應該屬於相應的EmploymentStartDateTerminationDate,但數據庫本身不會執行它(至少不是聲明性的)。