Thay vì review_autosave_data
bạn có thể tạo hai tab như review_insert_drafts
và review_update_drafts
(một cho các đánh giá mới và một cho các cập nhật đánh giá).
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`)
);
(Không chắc name
là gì là tốt cho.)
Trong ứng dụng của mình, bạn phải kiểm tra xem người dùng đang viết bài đánh giá mới hay đang cập nhật bài đánh giá hiện có.
Đối với các bài đánh giá mới mà bạn chạy:
INSERT INTO review_insert_drafts (product_id, user_id, review)
VALUES (50, 1, "lorem ipsum")
ON DUPLICATE KEY
UPDATE review = "lorem ipsum";
hoặc
REPLACE INTO review_insert_drafts (product_id, user_id, review)
VALUES (50, 1, "lorem ipsum");
Đối với các bản cập nhật đánh giá bạn chạy:
INSERT INTO review_update_drafts (review_id, review)
VALUES (25, "lorem ipsum")
ON DUPLICATE KEY
UPDATE review = "lorem ipsum";
hoặc
REPLACE INTO review_update_drafts (review_id, review)
VALUES (25, "lorem ipsum");
Ưu điểm:Bạn có một thiết kế rõ ràng với các khóa độc đáo và khóa ngoài rõ ràng.
Nhược điểm:Bạn có hai bảng chứa dữ liệu giống nhau. Vì vậy, bạn có hai câu lệnh chèn khác nhau. Và bạn sẽ cần một câu lệnh UNION nếu bạn muốn kết hợp hai bảng (ví dụ:hiển thị tất cả các bản nháp cho người dùng).