如何设计我的数据库?关于编辑历史记录

时间:2012-09-20 02:49:21

标签: mysql ruby-on-rails database-design

我想创建一个非常简单的数据库。但我想知道编辑历史!

显然,我们有:

Product

title | price | created_at | updated_at

在我看来,我将'edition'列添加到表中。版本的默认值为1.

当我使用Rails并编辑price列时,它会创建一个新记录,并且'edition'会增加。

示例:

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

我认为这不是最好的设计。

你还有其他想法吗?

4 个答案:

答案 0 :(得分:1)

你已经对数据库设计有了很好的答案,我只想加5美分并建议你不要重新发明轮子并自己实现常见的要求,看一下那些能为你做到的宝石,我个人推荐PaperTrail: https://github.com/airblade/paper_trail

答案 1 :(得分:0)

一个简单的修改:

您可以改为维护一个名为ProductChanges的表,而不是在product表中创建新记录,其中包含“field”,“from”,“to”列。当价格从12更新为8时,您可以创建一个包含值的记录(product_id =“”field =“price”,从= 12到= 8)。

答案 2 :(得分: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表时,只需将旧值转储到Product_History表中。

稍微灵活一点的方法是将数据存储在更加非规范化的状态:

Edit_History

Table_Name | Entity_ID | Previous_Value | Current_Value | Edit_Date | Edited_By

此第二个变体可用于记录对多个表的更改。 (请注意,这假设您没有复合主键。)

在这两种情况下,只要您想知道最新值,就可以查询Product表,并使用Product表的主键查询History表(与{{1中的'Product'表名一起使用)当你想知道这个实体经历过的变化的历史时。

答案 3 :(得分:0)

我的个人意见是,我会用列创建另一个表格(我会称之为changes

ID(PK),prod_id(FK),标题,价格,updated_at

每次更新主表时,我都会将主表中的当前值复制到changes表中。您不需要created_atedition列,因为前者不会发生变化,并且在此更改表中通过简单查询很容易找到后者。