Ja bym zrobił tak:
Tabela
product:
CREATE TABLE `test`.`product` (
`id` INT( 4 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 255 ) NOT NULL ,
`description` TEXT NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci
Tabela
producer:
CREATE TABLE `test`.`producer` (
`id` INT( 4 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 255 ) NOT NULL ,
`description` TEXT NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci
Tabela łącząca powyższe,
producer_product:
CREATE TABLE `test`.`producer_product` (
`producer_id` INT( 4 ) NOT NULL ,
`product_id` INT( 4 ) NOT NULL ,
`deleted_at` DATETIME NULL DEFAULT NULL ,
PRIMARY KEY ( `producer_id` , `product_id` )
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci
ALTER TABLE `producer_product` ADD FOREIGN KEY ( `producer_id` ) REFERENCES `test`.`producer` ( `id` );
ALTER TABLE `producer_product` ADD FOREIGN KEY ( `product_id` ) REFERENCES `test`.`product` ( `id` );
I teraz masz tak:
1. Dodajemy produkty:
INSERT INTO `test`.`product` ( `id` , `name` , `description` )
VALUES ( 1 , 'Omega', 'Fajna bryka' ), ( 2 , 'Punto', 'Lorem ipsum' ), ( 3 , 'Palio weekend', 'Bla bla' );
2. dodajemy producentów:
INSERT INTO `test`.`producer` ( `id` , `name` , `description` )
VALUES ( 1 , 'Opel', 'Marka I' ), ( 2 , 'Fiat', 'Bla bla' );
3. Łączymy:
INSERT INTO `test`.`producer_product` ( `producer_id` , `product_id` , `deleted_at` )
VALUES ( '1', '1', NULL ), ( '2', '2', NULL ), ( '2', '3', NULL );
Masz teraz wszystko jak na dłoni.
Możesz łatwo łącząc tabele wyciągać producentów po produkcie, produkty po producentach, ...
Pamiętając że aktywny producent to ten, który ma `deleted_at` == NULL
Teraz chcesz zmienić producenta dla Omegi (id=1 w tabeli
product) z Opla (id=1 w tabeli
producer) na Fiata (id=2 w tabeli
producer):
UPDATE `producer_product` SET `deleted_at` = NOW( ) WHERE `producer_product`.`producer_id` =1 AND `producer_product`.`product_id` =1
INSERT INTO `test`.`producer_product` ( `producer_id` , `product_id` , `deleted_at` ) VALUES ( '1', '2', NULL );
Takim oto zabiegiem masz:
1. Zmienionego producenta;
2. Zachowanego ostatniego, starego producenta i łatwy dostęp do niego (wyszukujesz te rekordy, które sa usunięte, sortujesz po czasie usunięcia malejąco i dajesz limit na 1);
3. BONUS: Cała historię zamian.