使用触发器增加修订号是不好的做法吗?

时间:2015-11-17 11:00:44

标签: mysql

我正在构建一个评论功能,并且在数据库设计上有点挣扎。目标是在用户决定修改/删除评论时保留所有历史记录。

我想象的列是

`commentID` int(11) NOT NULL,
`referencetype` char(1) NOT NULL,
`referenceID` int(11) NOT NULL,
`revision` tinyint(3) unsigned NOT NULL,
`comment` text NOT NULL,
`userID` int(11) NOT NULL,
`deleted` tinyint(1) NOT NULL DEFAULT '0',
`timestamp` int(11) NOT NULL,

添加新评论时,我希望commentID增加,并在向同一评论ID添加修订时,我希望修订号增加。

可能的解决方案是

  • 在commentID上添加非唯一索引并将其设置为auto_increment
  • 在(commentID,revision)
  • 上添加唯一索引
  • 创建一个在现有commentID上插入时增加修订的触发器

这是一个合理的解决方案吗?什么可能是更好的方式?

编辑:一些重要列的示例数据

+-----------+---------------+-------------+----------+-----------------------+--+
| commentID | referencetype | referenceID | revision |        comment        |  |
+-----------+---------------+-------------+----------+-----------------------+--+
|         1 | A             |         123 |        1 | Comment1              |  |
|         1 | A             |         123 |        2 | Comment1 first edit   |  |
|         2 | A             |         123 |        1 | Comment2              |  |
|         1 | A             |         123 |        3 | Comment1 second edit  |  |
+-----------+---------------+-------------+----------+-----------------------+--+

1 个答案:

答案 0 :(得分:3)

根据@daker对这个答案的第一个版本的评论,我想改变这个解决方案的重点。

您可以使用时间戳字段作为修订,而不是使用整数修订号。这样做,你可以这样定义你的表:

`commentID` int(11) NOT NULL AUTO_INCREMENT,
`referencetype` char(1) NOT NULL,
`referenceID` int(11) NOT NULL,
`comment` text NOT NULL,
`userID` int(11) NOT NULL,
`deleted` tinyint(1) NOT NULL DEFAULT '0',
`timestamp` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
...
PRIMARY KEY(commentID, timestamp)

然后你会得到这些好处:

  • 您的commentID是自动增量的
  • 您可以避免使用不必要的字段修订
  • 每次用户修改评论时,您都会在此表中创建一个新条目
  • 每个新注册的人都将自动保留修改时刻