MySQL - 为每条记录提供唯一键,而不是主键

时间:2009-12-30 19:57:33

标签: mysql primary-key key uniqueidentifier identification

好的,这是一个难以解释的问题。

我正在创建一个具有PAGES的应用程序,目前我正在使用PageID作为SEL记录的关键。

我现在遇到的问题是我希望用户能够编辑页面,但不会丢失上一页(对于历史记录,记录保留原因,如更改日志或维基页面历史记录)。

这让我觉得我需要在PAGE表中使用一个新字段作为pageID,但不是每次添加行时自动递增的主键。

Google Docs有一个DOCID:/ Doc?docid = 0Af_mFtumB56WZGM4d3Y3d2JfMTNjcDlkemRjeg

这样我可以拥有多个具有相同Doc ID的记录,并根据dataAdded字段显示历史记录更改日志。当用户想要查看该DOCID时,我只需提取最新的一个。

思考?我很欣赏你聪明的想法,指出我正确的方向!

6 个答案:

答案 0 :(得分:2)

你走在正确的轨道上。您需要的是历史记录或修订版ID以及文档ID。历史记录ID将是主键,但您还可以在文档ID上使用密钥进行查询。

使用历史记录跟踪,您的应用程序会增加一些复杂性。您必须要小心,文档的主视图显示当前的历史记录修订版(即给定文档ID的最大历史记录ID)。

同样,如果您要存储大型文档,那么每次编辑本质上都会将该文档的另一个副本添加到您的数据库中,并且该表将很快变得非常大。您可能需要考虑实现某种“差异”存储,只存储对文档的更改而不是完整的存储,或者将历史编辑保存在单独的表中,仅用于历史搜索。

答案 1 :(得分:1)

UUID()创建一个随机生成的128位数字,如 '6ccd780c-巴巴1026-9564-0040f4311e29' 这个数字将在几百万年内不再重复。

//注意大多数数字都是基于时间戳和机器信息,所以在重复调用时,许多数字都是相似的,但它总是唯一的。

答案 2 :(得分:0)

每个文件都是一个修订版:

doc - (doc_id)

修订版 - (rev_id,doc_id,version_num,name,description,content,author_id,active tinyint default 1)

然后你可以只用rev_id:/ view?id = 21981

打开任何内容

从修订版r中选择*,doc d其中r.rev_id =?和r.doc_id = d.doc_id

答案 3 :(得分:0)

保留一份包含更改历史记录的审计表。如果您需要回滚更改或查看更改历史记录,例如,这将允许您返回。

答案 4 :(得分:0)

你可以这样建模:

  • 一个应用程序有多个页面,一个页面有多个版本(每个版本都有一些版本信息(例如,日期,编辑计数),以及其页面的外键)
  • 查看页面显示最新版本
  • 保存编辑会创建新版本

答案 5 :(得分:0)

对我来说这对两张桌子来说听起来不错。您可能有一个page_header表和一个page_content表。标题表将保存静态信息,如标题,分类(无论如何),内容表将保存实际的可编辑内容。每次用户更新页面时,都会插入新的page_content记录而不是更新现有记录。当您显示页面时,请确保获取最新的page_content记录。这是保存历史记录并在需要时回滚的简单方法。

祝你好运!