MySQL数据库保持历史性变化(如维基)

时间:2018-04-27 07:58:10

标签: mysql database database-design

我有一个网站,我让用户更改几页,但现在我想以某种方式跟踪这些更改并将其显示给其他用户。 (我觉得像维基一样)

以下是我目前的情况:

id, title, description, country, language, last_update (and ~20+ more fields)

我正在考虑制作一个包含ID和最后一个history_ID的主表,然后历史表得到以上所有内容,这样每个新条目都会获得一个新的history_ID和所有新条目。

我觉得我可以做得更好。因为使用上面的方法,我最终会得到大量相似的行(只需改变一个字段或字母或其他内容)。

有什么建议吗?谢谢!

1 个答案:

答案 0 :(得分:0)

我认为你有正确的想法。您需要两个表,它们看起来应该类似于:

create table page (
  id bigint primary key not null,
  title varchar(100) not null,
  -- More columns here.
  -- The last version of the content column can added here as redundancy,
  --   for performance reasons.
  last_version_id bigint, -- allows null
);

create table page_version (
  id bigint primary key not null,
  content mediumtext not null,
  page_id bigint not null,
  constraint fk_pv_page foreign key (page_id)
    references page (id)
);

alter table page add 
  constraint fk_page_version foreign key (last_version_id)
    references page_version (id);

内容列的最后一个版本可以添加到page表中(将是多余的),以提高阅读/显示页面时的性能。

阅读页面通常比更新页面更常见,因此冗余可以使您的网站更快。

请注意列last_version_id允许空值,因此您可以在MySQL中实际插入/更新行(不会实现约束检查延迟)。