2

バージョン管理はpage、 hasのようなエントリで簡単nameです。トリガーまたはアプリケーション ロジックを使用して更新さpage_versionれるたびに、行の以前のすべての値を格納するテーブルが必要です。page

CREATE TABLE `page` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `page` (`id`, `name`)
VALUES
    (1,'Foo');

CREATE TABLE `page_version` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `page_id` int(10) unsigned NOT NULL,
  `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `entry_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `page_id` (`page_id`),
  CONSTRAINT `page_version_ibfk_1` FOREIGN KEY (`page_id`) REFERENCES `page` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `page_version` (`id`, `page_id`, `name`, `entry_timestamp`)
VALUES
    (1,1,'foo','2013-09-19 20:27:06');

page.nameこの例では、「foo」から「Foo」に変更されていることがわかります。再度変更された場合 (たとえば、"Bar" に)、"Foo" 値が追加されpage_version、元の行page.nameが "Bar" に更新されます。

ただし、エントリと 1 対多の関係を持つ依存値のバージョンを追跡するにはどうすればよいでしょうか。categoryたとえば、後者のスキーマがおよびcategory_pageテーブルを追加することによって補足された場合。

CREATE TABLE `category` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `category` (`id`, `name`)
VALUES
    (1,'One'),
    (2,'Two');

CREATE TABLE `page_category` (
  `page_id` int(10) unsigned NOT NULL,
  `category_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`page_id`,`category_id`),
  KEY `category_id` (`category_id`),
  CONSTRAINT `page_category_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`) ON DELETE CASCADE,
  CONSTRAINT `page_category_ibfk_1` FOREIGN KEY (`page_id`) REFERENCES `page` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ユーザーがページに新しいカテゴリ (「2」) を追加した場合、変更を (fooが に変更されたときと同じ変更で) キャプチャする方法は?Foo

4

2 に答える 2