对于一个项目,我需要在 MySQL 数据库中实现行版本控制。在阅读了可能的解决方案后,我选择使用一个表并添加一个start_date
和end_date
列,指定该版本/行何时处于活动状态。
对于行的多个版本,该id
列将是相同的。因此它在表中不再是唯一的。现在我不确定如何设置主键(和其他索引),同时保持id
列的自动增量活动。
我看到两个选项。第一个id
只是创建一个索引,如下所示:
CREATE TABLE `thing` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
… other_columns …,
`start_date` datetime NOT NULL,
`end_date` datetime DEFAULT NULL,
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
另一个是制作id
和start_date
主键,像这样:
CREATE TABLE `thing` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
… other_columns …,
`start_date` datetime NOT NULL,
`end_date` datetime DEFAULT NULL,
PRIMARY KEY (`id`,`start_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
最好的选择是什么,尤其是在考虑性能时?
例如,数据将如下所示:
id | some_column | start_date | end_date
---|-------------|------------|-----------
1 | Jonathn | 2013-01-01 | 2013-01-02
1 | Jonathan | 2013-01-02 | NULL
2 | James | 2013-02-01 | NULL
在这种情况下,我添加了“Jonathn”,但后来将其更改为“Jonathan”(同时保持相同的 ID)。稍后添加另一行(“James”)。