プロジェクトでは、MySQL データベースに行のバージョン管理を実装する必要があります。考えられる解決策について読んだ後、1 つのテーブルを使用し、そのバージョン/行がいつアクティブであったかを指定する列を追加することstart_date
にしました。end_date
id
列は、行の複数のバージョンで同じになります。したがって、テーブル内で一意ではなくなります。id
列の自動インクリメントを有効にしたまま、主キー (およびその他のインデックス) を設定する方法がわかりません。
2 つの選択肢があります。最初のものは、次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;
もう 1 つは、次のように主キーを作成すること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") が追加されます。