2

プロジェクトでは、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") が追加されます。

4

1 に答える 1

0

最初の例の CREATE TABLE ステートメントにはキー*がありませんが、2 番目の例にはあります。あなたの2番目の例はあなたが望むものだと思います:

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 を自動インクリメント列にしたい場合としない場合がありますが、それは論理的な設計やパフォーマンスではなく、主に機能の問題です (増分値を生成できるようにするか、自分で挿入できるようにするか)。

*残念ながら、MySQL はキーワードを使用してindexKEYを指定します。キーはor構文で指定する必要があります。UNIQUE KEYPRIMARY KEY

于 2013-09-19T05:05:55.887 に答える