Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何设计我的数据库?关于编辑历史_Mysql_Ruby On Rails_Database Design - Fatal编程技术网

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”是数据冗余。