26

Qual è il vantaggio della definizione di una chiave esterna quando si lavora con un framework MVC che gestisce la relazione?quali sono i vantaggi della definizione di una chiave esterna

Sto utilizzando un database relazionale con un framework che consente definizioni di modelli con relazioni. Poiché le chiavi esterne vengono definite tramite i modelli, sembra che le chiavi esterne siano ridondanti. Quando si tratta di gestire il database di un'applicazione in fase di sviluppo, la modifica/eliminazione di tabelle che utilizzano chiavi esterne è una seccatura.

C'è qualche vantaggio nell'usare chiavi esterne che sto abbandonando completamente?

+1

Le relazioni con le chiavi esterne rafforzano l'integrità dei dati a livello di dati, riducendo quindi i dati non validi che entrano nel sistema; no, non proprio. Per esempio, se tu avessi una tabella di persone con una relazione FK con la tabella di genere, uno sviluppatore potrebbe inserire un record in una persona con un genere di "bambini". Ora, potresti non interessartene, ma se costruisci la logica su voci valide e ti aspetti solo maschio/femmina, allora ... avrai un problema. Se si desidera decodificare il DB per ottenere un ERD, si avranno anche problemi. e impalcature e altre tecnologie si relazionano a questo livello di design ... – xQbert

+1

Molto correlato: [Perché le chiavi esterne sono più utilizzate in teoria che in pratica?] (http://stackoverflow.com/questions/1876013/why-are-foreign -keys-more-used-in-theory-than-in-practice) –

+1

Abbiamo avuto uno scenario simile in un posto in cui lavoravo: una app non aveva chiavi esterne perché l'ORM gestiva tutte queste cose ecc. Un giorno molto un cliente importante ha scoperto una significativa perdita di dati che è stata alla fine ricondotta a un bug nell'ORM. Molto dannoso per la relazione, incolpare lo sviluppatore ORM non aiuta. Le chiavi esterne sono state aggiunte molto presto! – onedaywhen

risposta

31

Le chiavi esterne con vincoli (in alcuni motori DB) forniscono l'integrità dei dati a livello basso (livello del database). Significa che non è possibile creare fisicamente un record che non soddisfa la relazione. È solo un modo per essere più sicuri.

+3

Un altro vantaggio è il DELETE a cascata. Per esempio diciamo che hai una tabella 'User' e una' Class'. Invece di riscrivere tutti i dati dell'utente in 'Class', basta fare riferimento all'ID dell'utente. Ma cosa succede se quell'utente viene cancellato? Se non si dispone dell'eliminazione a cascata attivata, la riga nella tabella Class punta a un utente inesistente. Cosa succede se quell'id utente viene sostituito da un utente completamente diverso? Questo è quando le cose si fanno davvero male. Elimina in cascata cancella tutti i record associati a quell'utente. Questo potrebbe non sembrare importante, ma se 'User' è collegato a molte tabelle, questo aiuta molto. –

+0

Ha qualche costo per noi? – Ahmad

13

Fornisce l'integrità dei dati applicata a livello di database. Ciò aiuta a prevenire eventuali errori nella logica dell'applicazione che potrebbero causare dati non validi.

Se qualsiasi manipolazione di dati viene eseguita direttamente in SQL che aggira la logica dell'applicazione, protegge anche da dati non validi che interrompono tali vincoli.

Un ulteriore vantaggio è che consente agli strumenti di generare automaticamente diagrammi di database con le relazioni desunte dallo schema stesso. Ora in teoria tutti i diagrammi dovrebbero essere fatti prima che il database sia creato, ma poiché il database si evolve oltre la sua incarnazione iniziale, questi diagrammi spesso non sono aggiornati, e la capacità di generare un diagramma da un database esistente è utile sia per revisione, oltre che per spiegare la struttura ai nuovi sviluppatori che aderiscono a un progetto.

Potrebbe essere utile disattivare gli FK mentre la struttura del database è ancora in flusso, ma è buona norma avere quando lo schema è più stabile.

11

Una chiave esterna garantisce un record corrispondente in una tabella esterna. Immagina una tabella denominata Books con un vincolo FK su una tabella denominata Authors. Ogni libro è garantito per avere un Author.

Ora, si può fare una ricerca del tipo:

SELECT B.Title, A.Name FROM Books B 
INNER JOIN Authors A ON B.AuthorId = A.AuthorId; 

Senza il vincolo FK, la mancanza di un Author fila causerebbe l'intero Book riga da cadere, con conseguente libri mancanti nel set di dati.

Inoltre, con il vincolo FK, il tentativo di eliminare un autore a cui è stato fatto riferimento da almeno un Libro potrebbe causare un errore anziché danneggiare il database.

2

I principali vantaggi sono l'integrità dei dati e le eliminazioni a cascata. Puoi anche ottenere un guadagno in termini di prestazioni quando sono definiti e quei campi sono correttamente indicizzati. Ad esempio, non si è in grado di creare un numero di telefono che non appartenesse a un contatto o quando si elimina il contatto è possibile impostarlo per eliminare automaticamente tutti i loro numeri di telefono. Sì, puoi effettuare tali connessioni nell'interfaccia utente o nel livello intermedio, ma ti ritroverai comunque orfano se qualcuno esegue un aggiornamento direttamente contro il server utilizzando SQL anziché l'interfaccia utente. La parte "seccatura" ti costringe a considerare queste connessioni prima di apportare modifiche in serie. Gli FK hanno salvato il mio bacon molte volte.

5

Mentre possono essere un problema quando si manipolano i dati di sviluppo/test, mi hanno risparmiato un sacco di problemi nella produzione.

Considerate come un modo per mantenere l'integrità dei dati, in particolare come salvaguardia contro i record orfani.

Ad esempio, se si ha una banca dati molti PhoneNumber record ad un Person, ciò che accade a PhoneNumber record quando il record Person viene cancellato per qualsiasi motivo? Esisteranno ancora nel database, ma l'ID dello Person a cui si riferiscono non sarà più presente nella tabella Person pertinente e si dispone di record orfani.

Sì, si potrebbe scrivere un trigger per eliminare il PhoneNumber ogni volta che un Person viene rimosso, ma questo potrebbe essere un casino se si elimina accidentalmente un Person e la necessità di rollback.

Sì, è possibile che si ricordi di eliminare manualmente i record PhoneNumber, ma per quanto riguarda altri sviluppatori o metodi che si scrivono a 9 mesi di distanza?

Con la creazione di una chiave esterna che assicura ogni PhoneNumber è legato a un Person esistente, sia assicurarsi contro distruggere questo rapporto e anche aggiungere 'indizi' per quanto riguarda la struttura di dati previsto.

Problemi correlati