Mysql 如何设计我的数据库?关于编辑历史
我想创建一个非常简单的数据库。但我想知道编辑历史 显然,我们有:Mysql 如何设计我的数据库?关于编辑历史,mysql,ruby-on-rails,database-design,Mysql,Ruby On Rails,Database Design,我想创建一个非常简单的数据库。但我想知道编辑历史 显然,我们有: Product title | price | created_at | updated_at 在我看来,我将“版本”列添加到表中。版本的默认值为1 当我使用Rails并编辑price列时,它将创建一个新记录,“edition”将增加 例如: Product TITLE | PRICE | CREATED_AT | UPDATED_AT | EDITION Plane | 12 | 9-19 | NULL
Product
title | price | created_at | updated_at
在我看来,我将“版本”列添加到表中。版本的默认值为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
我认为这不是最好的设计
你还有其他想法吗 一个简单的修改:
您可以维护一个名为ProductChanges的表,其中包含“field”、“from”、“to”列,而不是在product表中创建新记录。当价格从12更新到8时,您可以创建一个带有值的记录(product_id=“”field=“price”,from=12,to=8)。最简单的编辑映射实际上只是将旧数据存储在另一个表中:
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
然后,每次更新产品表时,只需转储产品历史表中的旧值
稍微灵活一点的方法是以更非规范化的状态存储数据:
Edit_History
Table_Name | Entity_ID | Previous_Value | Current_Value | Edit_Date | Edited_By
第二种变体可用于记录对多个表的更改。(请注意,这假设您没有复合主键)
在这两种情况下,只要想知道最新的值,就可以简单地查询产品表,并使用产品表的主键(与
Edit\u History
variant中的“Product”表名结合使用)查询历史表当您想知道该实体所经历的更改的历史记录时。我个人的意见是,我将创建另一个包含列的表(我将调用更改
)
id(主键)、产品id(FK)、标题、价格、更新地址
每次更新主表时,我都会将主表中的当前值复制到
changes
表中。您不需要在和版本中创建列,因为前者不会更改,后者很容易在这个更改表中通过简单的查询找到。您已经对数据库设计有了很好的回答,我只想加上我的5美分,并建议您不要重新发明轮子,自己实现通用需求,看看其中一个可以为您做到这一点的宝石,我个人推荐PaperTrail:
下次编辑价格8到80时,我认为“字段”和“to=8,from=8”是数据冗余。