2012-09-20 46 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