2012-09-20 81 views
0

我想創建一個非常簡單的數據庫。但我想知道編輯歷史!如何設計我的數據庫?關於編輯歷史

顯然,我們有:

Product 

title | price | created_at | updated_at 

在我看來,我的「版本」列添加到table.The版的默認設置爲1

當我使用Rails和編輯price列,它將創造一個新的紀錄,'版'將增加。

例子:

Product 

TITLE | PRICE | CREATED_AT | UPDATED_AT | EDITION 
Plane | 12 | 9-19  | NULL  | 1 

當我編輯,記錄應該是這樣創建的:

Product 

TITLE | PRICE | CREATED_AT | UPDATED_AT | EDITION 
Plane | 8  | 9-20  | NULL  | 2 

但我不知道如何選擇數據時,我想知道新版'飛機'產品。 當我搜索編輯歷史可以使用代碼,就像

scope :history, lambda { |tit| where(:title => tit) } //same title 

我不認爲這是一個最好的設計。

你有什麼建議嗎?

回答

0

最簡單的編輯地圖實際上只是舊數據存儲在另一個表:

Product_History 
-- Note: We have added a surrogate primary key 
-- This makes it possible to have duplicate product titles 
-- which we may wish to support later. 
-- It's just an auto-incrementing integer column. 
Product_ID | Title | Price | Created_At | Updated_At | Updated_By 

然後你只是每次做一個更新到產品表時傾倒在Product_History表中的舊值。

略微更靈活的方式是將數據存儲在一個甚至更規格化狀態:

Edit_History 

Table_Name | Entity_ID | Previous_Value | Current_Value | Edit_Date | Edited_By 

該第二變型可用於記錄更改多個表。 (請注意,這假定您沒有複合主鍵)。

在這兩種情況下,只要您想知道最新值並且使用產品表的主鍵查詢歷史記錄表(結合Edit_History變體中的'產品'表名稱)當你想知道這個實體經歷的變化的歷史。

0

一個簡單的修改:

而不是創建產品表的新紀錄,你可以改爲維護的表中調用ProductChanges,與列「場」,「從」,「到」。當價格從12更新到8時,您可以創建一個記錄(product_id =「」field =「price」,從= 12到= 8)。

+0

當我在下次編輯價格8到80時,我認爲'字段'和'to = 8,from = 8'是數據冗餘。 – JeskTop

0

我個人的看法是,我想創建另一個表(我會打電話給changes)與列

ID(PK),PROD_ID(FK),名稱,價格的updated_at

和每次我更新主表時,我都會將主表中的當前值複製到changes表中。您不需要created_atedition列,因爲前者不會更改,並且在此更改表中使用簡單的查詢很容易找到後者。

1

你已經有了關於數據庫設計的很好的答案,我只想添加我的5美分,並建議你不要重新發明輪子並自己實施常見要求,看一看能爲你做的那件寶石,我個人推薦PaperTrail: https://github.com/airblade/paper_trail