9

我目前正在研究一个简单的修订系统,它使我能够存储单个文件的多个版本,到目前为止效果很好。

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

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是文件名。

问题:

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

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

4

2 回答 2

5

为了检索,最有效的方法是添加一个像 is_latest 这样的列,您需要提前填充它,然后select * from table where file_id=1 and is_latest=true当您想要获取文件 1 的最新版本时。显然,这会使更新此表变得更加复杂。

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

假设您不想更改现有的表设计,您要做的就是选择 groupwise 最大值,请参阅这篇文章了解在 mysql 中执行此操作的几种不同方法。

于 2009-03-12T13:38:20.733 回答
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 排序,因为最高也将是最新的,等等。

于 2012-05-27T01:56:59.703 回答