没有删除数据库表

时间:2009-07-16 14:58:02

标签: mysql database-design

我需要创建一个文章系统,其中没有文章被删除。更重要的是,他们希望所有文章编辑,一旦保存原文,就可以创建新文章而不是覆盖旧文章。

所以,A人写第1条并保存。 B人编辑了第1条。

组织此数据库的最佳方法是什么?我的想法是:

  • 制品,
  • 文章,
  • ID
  • old_id(编辑前的文章ID,以便用户可以'撤消'),
  • 已删除(布尔值,如果删除,它将不会显示在系统中,除非用户查看'垃圾'),
  • 标题
  • 制品,
  • 创建(冗余?),
  • 已更新(上次更新日期),
  • user_id(上次更新文章的用户的ID)。

因此,当用户编辑文章时,它会创建新文章记录,但会将旧文章ID保存为参考。

这是最好的解决方法吗?还是有更有效的方法?

4 个答案:

答案 0 :(得分:2)

您可以在同一个表中显示相同的文章,但ID值不同。您可以根据最高ID确定活动文章,或者设置一个布尔值,例如'isActive。'。

这类似于SO和维基百科处理修订历史的方式。

PK | ID  |        Title         |        Text       |   Edited   | Edited By
-----------------------------------------------------------------------------
1  | 128 | History of Computin  | The History of... | 2009/07/10 | Jon Sampson
2  | 128 | History of Computing | The History of... | 2009/07/11 | John Smith

在这种情况下,我可以看到编辑了第128条。最新版本是John Smith的#2。

答案 1 :(得分:2)

维基百科的方式是它有一个表,IIRC称为“cur”,只包含每篇文章的当前版本,第二个表包含所有以前的版本。

优点是,如果表格较小,并且不必检查密钥和一些标记是否是最新的,那么“cur”上的查找可能会更快。

答案 2 :(得分:1)

TABLE Revisions:
 ID
 FK_Articles (Articles.ID)
 Status (active, deleted, etc)
 Content
 Metadata (timestamp, user data, etc)

TABLE Articles:
 ID
 FK_Revisions (Revisions.ID - current revision of the article)

答案 3 :(得分:1)

是的,我会去那。状态列,带有“A”(活动),“D”(已删除),“P”(待编辑批准)等。

您可能希望为文章上线时添加功能,因为许多系统可能需要等到显示文章之前的某个时间,但文章是事先上传的。

您可能希望保留静态文章标识符,以便具有该标识符的URL即使文章更新也能继续工作。可能值得拥有一个表格,将静态文章标识符与当前活动的文章ID(外键)链接起来。

如果你有大量的文章,那么有一个系统可以将旧版本的文章从文章表移动到存档的文章表中。