2009-03-01 34 views
18

Eventuali duplicati:
What’s wrong with foreign keys?Devo usare chiavi esterne?

Io uso MS Sql Server con un database di grandi dimensioni di circa 4 GB di dati.

Cerco il Web perché dovrei usare chiavi esterne. a questo punto ho solo indicizzato le chiavi utilizzate per unire le tabelle. Le prestazioni vanno bene, l'integrazione dei dati non è un problema.

Devo utilizzare chiavi esterne? Otterrò ancora più prestazioni con le chiavi esterne?

risposta

5

Una chiave esterna è principalmente uno strumento per rafforzare l'integrità del database, che non è correlato alla velocità di esecuzione.

Se la progettazione dell'indice è già stata ottimizzata, probabilmente questi indici sono già installati, almeno come indici non univoci. Quindi non mi aspetterei alcuna modifica delle prestazioni solo dall'installazione di chiavi esterne (non coinvolgere necessariamente nemmeno un indice.)

Sarei un po 'sospettoso del tuo compiacimento per l'ottimizzazione del tuo progetto, però, se non hai già questo concetto inchiodato.

Leggere la documentazione per le chiavi esterne con l'obiettivo di capire cosa fanno per far rispettare l'integrità (vale la pena sapere in ogni caso). Quindi vedere se questo non risponde alla tua domanda più completamente.

+1

"estranei alla velocità di esecuzione" non è del tutto esatto per inserti (so che lo sai, ma Tuan potrebbe non) – SquareCog

+0

Thx - ho compilato la risposta un po ', in un modo che dovrebbe finire nello stesso posto. – dkretz

+0

buona richiesta di inserto. ho una buona visione della struttura. come ho detto l'integralità non è un problema. ho bisogno di velocità raw. –

13

Le chiavi esterne non migliorano effettivamente le prestazioni, in quanto comportano una piccola riduzione delle prestazioni su tutte le operazioni di scrittura, per garantire che il vincolo venga rispettato.

Il motivo per cui si desidera utilizzare questi è per impedire operazioni di scrittura distruttiva. Se non li hai, il codice buggy o una cattiva istruzione sql possono rimuovere le righe che dovrebbero essere lì.

1

Le chiavi esterne rendono l'integrità dei dati migliore, le prestazioni, un po 'più lente durante l'eliminazione/inserimento/aggiornamento.
Nella mia ultima società abbiamo deciso di mantenere l'integrità/connessioni nel BL, in quanto rende più semplici le modifiche nel BL (si pensi a centinaia di milioni di record). Se hai una piccola app, non vedo perché non farlo nel livello dati (db)

+0

Cosa significa BL? – usefulBee

+1

Livello aziendale, livello dati gestisce il codice che parla direttamente al db. BL acquisisce tali dati e implementa le regole aziendali utilizzando tali dati e li invia all'interfaccia utente. È un modo un po 'vecchio per guardare un software multy tiered. Oggi abbiamo più di tre livelli/livelli e abbiamo un sistema ampiamente distribuito da aggiungere a questo. –

+0

Dicendo "abbiamo deciso di mantenere l'integrità/connessioni nel BL", ti riferisci all'approccio Code First o cos'altro? – usefulBee

4

Cosa non è stato menzionato nella vecchia domanda a cui SquareCog si è collegato in precedenza - sì, i vincoli di chiave esterna possono essere un problema quando pulizia dei dati, aggiornamenti batch, generazione di dati di test o qualsiasi tipo di operazione in cui si ignora la normale sequenza di cose. Ma - puoi sempre abbandonare i vincoli delle tue chiavi esterne prima di fare qualcosa di simile, e poi ricrearli di nuovo più tardi (se hai gli oggetti del tuo database scriptati correttamente, questo non è certo un lavoro extra).

Ero un pigrone, ma sono arrivato a dipendere da vincoli di chiave esterna. Ci sono ancora situazioni in cui non puoi averle, come nelle relazioni tra database.

3

C'è una funzione/vincolo che le chiavi esterne portano al vostro sistema, che non è stato menzionato finora. Questa è la logica di commit/transazione (è così che la chiamo comunque). Con le chiavi esterne abilitate, tutte le righe per un aggiornamento, in tutte le tabelle interessate, devono essere presenti per il commit in modo che funzioni (non viene generato un errore SQL a cui sono stati violati i vincoli di chiave esterna).

Se si dispone di un corpo di codice, che funziona e "riproduce veloce e libero", con commit/transazioni. Quindi potresti essere pronto per qualche rimedio, per far funzionare le cose con FK nello schema.

Inoltre, Oracle almeno, consente di disabilitare i vincoli (non solo eliminare/rimuovere). Quindi puoi accenderli/spegnerli facilmente. Pratico, quando si desidera eseguire alcune operazioni di massa senza il sovraccarico dei vincoli, o eseguire un "intervento chirurgico" sui dati che presenta stati intermedi che non supererebbero i vincoli.

+0

Entrambe sono menzionate nel link che ho postato, ma Voterò comunque per te. La "commit/transaction logic" è ufficialmente definita come ACID garanzie (la "C" è coerente, poiché, dopo che una transazione è finita, i dati sono coerenti con i vincoli dichiarati). – SquareCog

1

Le chiavi esterne aiutano anche a mantenere pulito il database, poiché il database può subire un calo a cascata.

9

L'integrità potrebbe non essere un problema oggi, ma questo è l'atteggiamento esatto che lo rende un problema tra domani o due settimane.

4

In MySQL è possibile disabilitare chiave esterna di con SET FOREIGN_KEY_CHECKS=0