Domanda

Io e il mio amico abbiamo discusso a vicenda sulla progettazione di un database.
Sostiene che per garantire l'integrità di un database complesso è meglio usare i trigger.

Credo che a questo scopo sia meglio usare chiavi (primarie, uniche) e vincoli.
Penso che l'uso dei trigger sia pericoloso, perché funzionano & Quot; dietro la scena & Quot; e non è facile dire cosa accadrà dopo l'esecuzione di un comando. Inoltre, se il trigger ha un bug, può compromettere l'integrità del DB.

Cosa ne pensi?

È stato utile?

Soluzione

" Ecco una discussione AskTom sull'argomento. Non esiste una regola rigida e veloce sulla questione (altrimenti non ci sarebbe alcun dibattito!) ... & Quot;

Sì, c'è. Dichiarativo è sempre meglio dell'attuazione procedurale. Dichiarativo è meno soggetto a errori. Dichiarativo è più facile da mantenere. Dichiarativo è più autocompensante che implementato proceduralmente. Dichiarativo offre l'occasione migliore per l'ottimizzazione del DBMS e il DBMS È un ottimizzatore migliore del programmatore, il più delle volte.

L'unico vantaggio nell'implementazione procedurale è che significa posti di lavoro per coloro che sarebbero senza uno se fossero disponibili veri vincoli dichiarativi, non solo il povero PK + FK che otteniamo da SQL.

Altri suggerimenti

In realtà non dici perché il tuo amico pensa ciò che pensa, ma, in ogni caso, i vincoli / le chiavi sono il modo standard, definito e corretto per garantire l'integrità dei dati, per due motivi:

  • Tutti li conoscono ed eviterai di violare il principio della minima sorpresa usandoli.

  • Sono già implementati, testati e funzionanti.

Non vi è alcun vantaggio effettivo nel distribuire il proprio codice di integrità dei dati. I trigger sono destinati ad altri casi d'uso, come (ad esempio) la memorizzazione di tutti gli inserimenti.

Non hai specificato quale database, ma assumerò uno standard ANSI, DBMS relazionale come Oracle o SQL Server.

Immagino che dipenda da cosa intendi per integrità. Se stai solo cercando di tenere insieme tutti i record figlio e i record genitore e prevenire gli orfani, allora il RI incorporato usando vincoli di chiave primaria ed esterna è la strada da percorrere.

Se il tuo RI è più complicato, ad esempio se il campo 1 nel record principale è > 100, quindi il campo 2 nel record figlio deve essere & Lt; 200. I trigger devono essere utilizzati.

Non userei i grilletti per imporre un semplice RI, quella ruota è già stata inventata.

Non penso che sia chiaramente tagliato in un modo o nell'altro, ma prima di tutto, tendo ad usare i vincoli DRI per tutto ciò che può essere fatto in un vincolo DRI, e salvare i trigger per quelle cose che non possono essere fatte in un vincolo DRI (come prevenire la sovrapposizione di daterange)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top