Zamiast review_autosave_data
możesz utworzyć dwie tabele, takie jak review_insert_drafts
i review_update_drafts
(jeden dla nowych recenzji i jeden dla aktualizacji recenzji).
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`)
);
(Nie jestem pewien, jaka jest name
kolumna jest dobra dla.)
W swojej aplikacji musisz sprawdzić, czy użytkownik pisze nową recenzję, czy aktualizuje istniejącą.
W przypadku nowych recenzji, które wygenerujesz:
INSERT INTO review_insert_drafts (product_id, user_id, review)
VALUES (50, 1, "lorem ipsum")
ON DUPLICATE KEY
UPDATE review = "lorem ipsum";
lub
REPLACE INTO review_insert_drafts (product_id, user_id, review)
VALUES (50, 1, "lorem ipsum");
Aby uruchomić aktualizacje recenzji:
INSERT INTO review_update_drafts (review_id, review)
VALUES (25, "lorem ipsum")
ON DUPLICATE KEY
UPDATE review = "lorem ipsum";
lub
REPLACE INTO review_update_drafts (review_id, review)
VALUES (25, "lorem ipsum");
Zalety:Masz przejrzysty projekt z wyraźnymi unikalnymi kluczami i kluczami obcymi.
Wady:Masz dwie tabele zawierające podobne dane. Masz więc dwie różne instrukcje wstawiania. I będziesz potrzebować oświadczenia UNION, jeśli chcesz połączyć dwie tabele (np. pokazać wszystkie wersje robocze dla użytkownika).