2016-03-26 43 views
1

我會盡力描述我想要完成的工作,我找到的解決方案,並且會對您的輸入/建議感到高興。數據庫設計允許存儲來自可能會改變的外部關係的數據

我有這兩個表:

InvoiceType 
----------- 
invoice_type_id PK 
type_name 
line 
show_in_income 
..(other attributes).. 

Invoice 
------- 
invoice_id PK 
invoice_type_id FK 
..(other attributes).. 

比方說,我們有如下條目:

someInvoiceType: (1, "some name", "A", 1, ...) 
    someInvoice: (1, 1, ...) 

我想的是,即使的屬性someInvoiceType被編輯,例如「有些名」變化「其他名稱」,在someInvoice,同時它有第一個值,保持舊的已創建。

所以我的(那種明顯的)解決方案是有一個單獨的表來存儲來自InvoiceType數據,這可能會改變,我想保留:

InvoiceInfo 
------------ 
invoice_info_id PK 
invoice_id FK 
type_name 
line 
show_in_expenses 

這將充滿只有當發票創建,因此將用於檢索我可能需要的所有信息,並且不會依賴任何更改。

我擔心的是,這個解決方案似乎有點「靜態」,並且不能真正展開,以防我想存儲更多屬性信息。

正如我在開始時所說的,我真的很想在我的場合提出一些建議/意見,甚至更好的設計方法。
非常感謝!

回答

0

這是ERP系統中的一個非常普遍的問題:無論發生什麼事情,發票都不能更改。

有2個常用的解決方案:

  1. Denormalise。在發票表格中,只需保存與發票相關的所有信息,而不僅僅是其他查找表的外鍵。這是最簡單的解決方案,因爲如果您想修改發票表中的任何內容,您必須直接操作發票表。而且,從查詢角度來看,這也是最有效的,因爲您不需要複雜的查詢來查找歷史版本的查找表中的相關數據。

  2. 版本控制。相關查找表需要存儲版本歷史記錄,因此通過查詢,您可以查看創建發票時的有效參數。這樣可以節省您對發票表的非規格化,但查詢會變得複雜,因爲您必須能夠在查找表中找到每個相關數據的歷史版本。

+0

我想我可以回去和denormalise,它確實使一些操作更簡單,更快。 除了時間和查詢的複雜性,這個解決方案還有其他優勢嗎? 或者說得更好一些,我的方式是否能爲您的第一個解決方案提供任何優勢(您可以想到)? 非常感謝您的時間和迴應! – Systemfreak

+0

版本控制解決方案的優勢在於它不會非規範化:)通過版本控制,您可以跟蹤參數的變化(例如,考慮定價),通過非規範化您可能會丟失一些此類信息。如果查找鍵不同,版本控制也可能有所幫助,但查找值是相同的。示例:稅收 - 您可能擁有相同的有效稅務鍵,但設置它的原因可能不同。實際上,您可以混合使用兩種方法:使用版本控制,其中保持版本化信息可產生額外的業務優勢,並在不進行非規範化的情況下使 – Shadow

+0

好吧,我將不得不考慮這一點,非常感謝您的意見:) – Systemfreak