【问题标题】:How to design my database?About edit history [closed]如何设计我的数据库?关于编辑历史[关闭]
【发布时间】:2012-09-20 02:49:20
【问题描述】:

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

显然,我们有:

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

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

您还有其他想法吗?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      最简单的编辑图其实就是把旧数据存到另一个表里:

      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 表变体)当你想知道这个实体所经历的变化的历史时。

      【讨论】:

        【解决方案3】:

        一个简单的修改:

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

        【讨论】:

        • 下次编辑价格 8 到 80 时,我认为 'field' 和 'to=8 ,from =8 '是数据冗余。
        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2019-05-22
          • 2015-01-10
          • 1970-01-01
          • 2011-04-21
          • 1970-01-01
          • 1970-01-01
          • 2021-07-23
          • 1970-01-01
          • 2011-01-13
          相关资源
          最近更新 更多