2010-10-04 87 views
2

我有Item的實例,我希望在組ItemGroup。但是,如果Item被移到另一個項目組,我想跟蹤問責原因的更改。例如。我需要知道Item是在10月份的一個ItemGroup中,還是在9月份。我應該如何建模數據庫和OOP中的組關係?

我該如何在數據庫中建模?我應該如何在我的課程OOP中對此進行建模?我可以看到幾種不同的解決方案,但它們都以某種方式複雜化,所以我不知道如何實現它。

要麼我可以與三個表,ItemItemGroupGroupRelation並保留在GroupRelation時間戳。如果項目信息更新,我需要創建一個新項目和一個新的GroupRelation。如果項目更改組,我必須創建一個新的GroupRelation。如果集團信息發生變化,我必須創建一個新的Group和一個新的GroupRelation。這很複雜,因爲我必須在變更時創建多個新對象。

Item 
+----+---------+-----+------+ 
| id | item_nr | ean | name | 
+----+---------+-----+------+ 

ItemGroup 
+----+------------+-----+ 
| id | group_name | vat | 
+----+------------+-----+ 

GroupRelation 
+----+---------+----------+-----------+ 
| id | item_id | group_id | timestamp | 
+----+---------+----------+-----------+ 

另一種解決方案可能是隻有兩個班ItemItemGroup但我必須二者的時間戳,所以我知道,當他們被改變。如果組更新了,我必須更新屬於該組的所有項目,所以這也很複雜。

Item 
+----+---------+-----+------+----------+-----------+ 
| id | item_nr | ean | name | group_id | timestamp | 
+----+---------+-----+------+----------+-----------+ 

ItemGroup 
+----+------------+-----+-----------+ 
| id | group_name | vat | timestamp | 
+----+------------+-----+-----------+ 

而且可能還有其他解決方案,其中一個可能是將舊版本移動到另一個表格。但是,當查找當前數據和舊數據時,搜索數據會非常複雜。或者我可以有一個鏈接到舊版本的列prev_id

有沒有人有類似數據模型的經驗,並有任何建議?有這種問題的最佳做法嗎?

+0

我不遵循你的一些邏輯。爲什麼當更新其中的某些信息時,您需要創建新的項目/組? – 2010-10-04 19:22:00

+0

@Joe:出於問責原因。舊版本必須保存。 – Jonas 2010-10-04 19:25:08

回答

3

我會用你的Item,ItemGroupGroupRelation作爲一個很好的標準化設計,最小的重複。

您的審計需求可以用您需要審計的每個表的附加表建模(例如:ItemAudit,ItemGroupAudit),其中包含您需要審計的字段和時間戳。每當可審計字段發生更改時,您都會填充審計表。

這樣,你有一個歷史記錄,不要用歷史數據阻礙你的日常表格。

+0

謝謝,這看起來不錯。我是否也需要一個'GroupRelationAudit'?我想是這樣。如果OO設計,我認爲即使我有三個表項目,ItemGroup和GroupRelation,或者我錯誤地使用了兩個類Item和ItemGroup,它應該足夠了嗎? – Jonas 2010-10-04 19:34:45

+0

@Jonas - 我不能告訴你你需要什麼。如果您需要審覈'GroupRelation',那麼是的,您可能也需要這樣做。至於OO設計,「Item」和「ItemGroup」對象應該足夠了(只要有一個引用就足夠了)。您可能還需要每個歷史數據的集合。 – Oded 2010-10-04 19:36:44

+0

啊,聽起來不錯。我可以將ItemAudit實例保存在Item中的一個集合中。 – Jonas 2010-10-04 19:39:48

0

從您的描述中我認爲有一個GroupRelationHistory的概念隱含在你的模型中。我會讓它成爲像ItemItemGroupGroupRelation這樣的自己的實體。

在對象世界,我會讓Item要知道它的GroupRelationHistory的,這意味着一個Item對象必須GroupRelationHistory對象的引用。本質上GroupRelationHistory只是一個零,一個或多個GroupRelation s的列表。

介紹這個概念應該由真正的商業需求來支持。去你的客戶(或一些代表),並詢問歷史是否有其自身的實體,並具有一定的商業價值。如果是,請考慮這種方法並根據業務需求進行改進。然後考慮一下數據庫模型,這很大程度上取決於具體的改進。如果不是,那麼我會讓歷史概念成爲一個純粹的審計功能,如Oded建議。

相關問題