review_autosave_data
の代わりに review_insert_drafts
のような2つのテーブルを作成できます およびreview_update_drafts
(1つは新しいレビュー用、もう1つはレビューの更新用です。)
CREATE TABLE `review_insert_drafts` (
`product_id` int(11) unsigned NOT NULL,
`user_id` int(11) unsigned NOT NULL,
`review` blob,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`product_id`, `user_id`),
CONSTRAINT FOREIGN KEY (`product_id`) REFERENCES `products` (`id`),
CONSTRAINT FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
);
CREATE TABLE `review_update_drafts` (
`review_id` int(11) unsigned NOT NULL,
`review` blob,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`review_id`),
CONSTRAINT FOREIGN KEY (`review_id`) REFERENCES `reviews` (`id`)
);
(name
が何であるかわからない 列はに適しています。)
アプリケーションでは、ユーザーが新しいレビューを書いているのか、既存のレビューを更新しているのかを確認する必要があります。
実行する新しいレビューの場合:
INSERT INTO review_insert_drafts (product_id, user_id, review)
VALUES (50, 1, "lorem ipsum")
ON DUPLICATE KEY
UPDATE review = "lorem ipsum";
または
REPLACE INTO review_insert_drafts (product_id, user_id, review)
VALUES (50, 1, "lorem ipsum");
実行するレビュー更新の場合:
INSERT INTO review_update_drafts (review_id, review)
VALUES (25, "lorem ipsum")
ON DUPLICATE KEY
UPDATE review = "lorem ipsum";
または
REPLACE INTO review_update_drafts (review_id, review)
VALUES (25, "lorem ipsum");
利点:明確な一意のキーと外部キーを備えた明確なデザインがあります。
短所:同様のデータを含む2つのテーブルがあります。したがって、2つの異なる挿入ステートメントがあります。また、2つのテーブルを組み合わせる場合は、UNIONステートメントが必要になります(たとえば、ユーザーのすべての下書きを表示する)。