[ruby-it] le foreign keys.
Luca Mearelli
luca.mearelli a gmail.com
Gio 18 Dic 2008 15:10:35 CET
2008/12/18 Paolo Montrasio <paolo a paolomontrasio.com>:
> Credo che faccia proprio a meno delle reference e gestisca tutto con i
> trigger. Dovrebbe avere circa lo stesso effetto ma mi chiedo se sia una
> buona soluzione: se oltre ai trigger ci sono anche le foreign key forse
> una ragione ci sarà... Ci vorrebbe però un esperto DBA per disquisire
> di queste cose sapendo veramente quel che si dice. Ce n'è qualcuno che
> ci legge?
non sono un dba, ma provo ad aggiungere qualcosa alla discussione:
Idealmente i trigger sono da preferire (per lo scopo in oggetto)
perche' permettono di definire le regole di consistenza dei dati in
maniera "dichiarativa", ovvero come proprieta' del modello dei dati.
Insomma sono una soluzione piu' "pulita" al problema di mantenere la
consistenza della base dati, e la manutenzione e' piu' semplici
rispetto ai trigger (e.g. non c'e' bisogno di tenere allineate tre
diverse procedure per delete, insert ed update)
Ma in realta' *dipende* dal database che si usa perche' trigger e
constraints sono implementati in maniera diversa sui diversi database.
Addirittura in MySQL non tutti gli storage engine mettono a
disposizione le foreign key: le tabelle MyISAM, pur accettando la
definizione di una FK senza errori poi NON la usano :)
per esempio:
CREATE TABLE parent_innodb (id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE child_innodb (id INT, parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY (parent_id) REFERENCES parent_innodb(id)
) ENGINE=INNODB;
insert into parent_innodb values (1);
insert into child_innodb values (1, 1);
commit;
select * from child_innodb;
insert into child_innodb values (1, 2);
select * from child_innodb;
delete from parent_innodb where id=1;
CREATE TABLE parent_myisam (id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM;
CREATE TABLE child_myisam (id INT, parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY (parent_id) REFERENCES parent_myisam(id)
) ENGINE=MyISAM;
insert into parent_myisam values (1);
insert into child_myisam values (1, 1);
commit;
select * from child_myisam;
insert into child_myisam values (1, 2);
select * from child_myisam;
delete from parent_myisam where id=1;
In quei casi usare un trigger puo' essere l'unico modo (a meno di
cambiare il db).
un paio di link (su MySQL o Oracle)
- http://www.oracle.com/technology/oramag/oracle/08-sep/o58asktom.html
- http://stackoverflow.com/questions/229765/triggers-that-cause-inserts-to-fail-possible
- http://forge.mysql.com/wiki/Triggers#Emulating_Check_Constraints
ciao!
Luca
More information about the Ml
mailing list