0

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

显然,我们有:

Product

title | price | created_at | updated_at

在我看来,我将“版本”列添加到表中。版本的默认值为 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

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

你有什么其他想法吗?

4

4 回答 4

1

你已经得到了关于数据库设计的好答案,我只想加我的 5 美分,并建议你不要重新发明轮子并自己实现常见要求,看看可以为你做这件事的宝石之一,我个人推荐PaperTrail: https ://github.com/airblade/paper_trail

于 2012-09-20T11:39:41.443 回答
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 表的主键(与Edit_History变体中的“Product”表名称相结合)查询 History 表知道这个实体所经历的变化的历史。

于 2012-09-20T02:59:21.173 回答
0

我个人的意见是,我会用列创建另一个表(我会调用changes

id (PK)、prod_id (FK)、标题、价格、updated_at

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

于 2012-09-20T03:06:48.267 回答
0

一个简单的修改:

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

于 2012-09-20T02:58:40.397 回答