使用MySQL创建简单修订系统的最佳方法是什么?

时间:2009-03-12 13:32:20

标签: mysql database database-design revision

我目前正在开发一个简单的修订系统,它可以存储单个文件的多个版本,到目前为止工作正常。

表结构如下(为简洁起见,删除了过时的列):

file_id     file_revision     file_parent      file_name
--------------------------------------------------------
1           1                 0                foo.jpg
2           2                 1                foorevised.jpg                 
3           3                 1                anotherrevision.jpg

其中:

  • file_id是主键,自动递增
  • file_revision存储修订号,默认为1,当它是第一个时
  • file_parent是修订版的顶级父级,首次默认为0
  • file_name是文件名。

问题:

  • 最好使用单个查询我想要检索所有文件......
  • 但只有每个文件的最新版本......
  • ...当只存储一个修订版本(原始版本)时,应检索此版本。

非常感谢任何指针。提前谢谢。

2 个答案:

答案 0 :(得分:4)

为了检索,最有效的方法是添加一个像is_latest这样的列,你需要提前填充,然后{@ 1}}当你想要获取最新版本的文件1.显然这会更新然而,这个表格更复杂。

另一种方法是将最新版本的文件存储在一个表中,将历史版本存储在另一个表中。如果您主要想要选择最新版本的所有文件,即使is_latest被编入索引,select * from table where file_id=1 and is_latest=true也可能相当于全表扫描。如果最新的行都在一个表中,则数据库可以在顺序IO中全部读取它们,而不必另外1)通过表执行大量搜索以找到它所需的记录或2)扫描整个表丢弃大旧记录沿途的数据量。

假设您不想更改现有的表设计,您想要做的就是选择groupwise最大值,有关在mysql中执行此操作的几种不同方法,请参阅this article

答案 1 :(得分:1)

file_id     file_revised     file_name              Time_Stamp
-----------------------------------------------------------------
1           1                 foo.jpg                 insert_time
2           1                 foorevised.jpg          insert_time                 
3           1                 anotherrevision.jpg     insert_time

然后我会对这样的查询进行修改:

SELECT * WHERE file_revision = 1 ORDER BY Time_Stamp GROUP BY file_revision

或者此类查询的任何数量的变化,即限制1或按file_id排序最高也将是最新的等等。