2009-08-17 61 views
4

我在這裏的第一個問題,所以很好!使用自然鍵或使用代理鍵和審計表進行審計/更改日誌

我是一個初級開發者,沒有太多的經驗,並且遇到了這個問題。

我有一張需要可審計的表格。假設這個表格記錄了呼叫中心打出的電話(不是,但這只是一個例子)。我會稱之爲「CallHistory」。

我原本計劃保留一個名爲「Callees」的單獨表格,其中包含被調用者的姓名,電話號碼等。該表格將使用代理主鍵。

CallHistory表將具有被調用表的外鍵。

我原來是這樣做的,如果我改變了被叫方的電話號碼,它會在整個系統中傳播,我不必在多個表中更改電話號碼。

問題是,CallHistory表的全部要點是記錄呼叫的HISTORY,包括撥打錯誤的電話(例如,呼叫方撥打了錯誤的號碼)。使用這種替代關鍵方法,歷史將會丟失。

其中一位高級開發人員在工作時建議在CallHistory表中的特定時間保留呼叫者的每個撥號電話號碼的副本以保留歷史記錄。

我在考慮爲相同的目的保留審覈/更改日誌表。

我的方法是否足夠這個purpsose或我完全偏離軌道?你更喜歡哪種方法?

乾杯, 安德魯

回答

1

我同意Rik。是的,冗餘數據是非常非常糟糕的,邪惡的,臭的,否則不可取的。但僅僅因爲兩個字段被稱爲「電話號碼」並不能使它們成爲一樣的東西。 「客戶的當前電話號碼」和「我們上次與他談話時的客戶電話號碼」並不一定是同一件事。

我目前正在使用保持銷售和物品信息的數據庫。物料記錄包括描述,庫存號和價格等信息。我們的銷售記錄還包括描述,庫存號和價格。說明和庫存號碼是多餘的,應予以刪除。這是糟糕的設計。但價格必須包含在兩個地方。當前價格與特定銷售時的價格有很大差異。這次出售可能是幾年前的事了。自那以後價格可能已經改變了十幾次。

一般來說,在你描述的應用程序中,我只是把電話號碼放在歷史記錄表中,然後完成它。有一個「電話號碼歷史記錄」表,並鏈接到當時適用的電話號碼記錄幾乎沒有得到。它可能會爲每個記錄節省幾個字節,但會增加一些複雜性。但是,如果有幾個相關領域,故事就會改變。如果說 - 我只是在這裏發明一個例子來表達這個想法 - 你是一家健康保險公司,根據不同的州法律,該地區的可用醫生等,您的保險條款因地點而異,所以當客戶移動他的保單時必須重寫,現在的電話號碼可能與其他許多數據項有關,因此所有的都應該放在一張表中,並鏈接到相應的記錄。否則,您可能擁有新澤西州的電話號碼,但您鏈接到加州政策條款等。

1

你提的問題是非常典型的設計難題。例如,如果您有正常形式的數據庫,並且您有以下表格:銷售人員,銷售人員(經銷商)和區域(經理正在工作)。您正在構建像「按地區分組的年銷售額」這樣的報告,您將銷售與區域的經理和經理一起加入。但是,如果其中一位經理在一年中將搬遷到另一個辦公室,似乎您的報告將顯示不正確的數據,對嗎?

什麼是3個解決方案

1)在某些情況下,開發者和分析師決定:好,我們的數據是不是很正確的,但它是確定現在,我們想留在正常的形態和不重複的數據。這個解決方案不那麼複雜。在這種情況下,您可以以正常形式創建呼叫者和呼叫歷史表,即電話號碼將僅位於呼叫者表中。

2)有一個要求,不要失去任何歷史變化。我們希望我們的報告和查詢速度非常快(以數據庫大小爲代價)。在這種情況下,人們決定複製所有字段。例如,您可以創建具有電話號碼,呼叫者姓名,地址等的CallHistory表,因爲您預計這些字段中的每一個都可以在將來進行更改。當然,你也可以創建Callee表(也許你會需要它用於另一個目的),但它可能會被CallHistory收斂,可能不會。假設您認爲某些記錄需要從被調用方中刪除,但希望它們位於CallHistory中。當開發人員經常認爲他們可能違反數據的參照完整性時,情況就是這樣,不要在CallHistory表中創建任何外鍵。這是合理的,因爲沒有外鍵,插入將工作得更快。

3)方法我喜歡更多,但從實現的角度來看它是最複雜的:CallHistory表應參考CalleeHistory表。 CalleeHistory表將包含Callee表所有的文件,但它也具有代理鍵,如CalleeID + DateModified(有時代替DateModified開發人員使用ModificationVersionNumber)。在CallHistory中,我們有一個引用CalleeID + DateModified的代理外鍵。在這種情況下,您已經規範化了數據(即電話號碼未在不同表格中公佈),並且您也沒有丟失任何歷史變更。據我所說,在實現的複雜性,數據庫性能,數據庫大小,數據完整性和系統的功能需求之間往往有一個折衷。如果您是初級開發人員,考慮所有可能的解決方案是很好的,但是您可能應該聽一位資深開發人員,他們比堆棧溢出的人更瞭解您的系統和需求。

p.s.

如果您想了解其他方法,瞭解緩慢變化的尺寸,例如http://en.wikipedia.org/wiki/Slowly_changing_dimension

2

我覺得你被這兒的人對正常形成了微妙的誤導。問題是,與被呼叫者關聯的電話號碼是,與呼叫者撥打的號碼不同,該信息是。它們在一般情況下可能具有相同的價值,但這是另一個問題。

所以在我看來,CallHistory應該同時撥打numbre和參考被叫表。