Domanda

Stiamo progettando un database in cui devo prendere in considerazione alcuni FK (chiave esterna) vincoli. Ma non è limitato a strutturazione formale e normalizzazione. Lo facciamo solo se ne fornisce vantaggi in termini di prestazioni o scalabilità.

Ho analizzato alcuni articoli interessanti e ho cercato su Google vantaggi pratici. Ecco alcuni link:

http://www.mssqltips.com/tip.asp?tip=1296

Volevo saperne di più sui vantaggi di FK (a parte la strutturazione formale e la famosa eliminazione / aggiornamento a cascata).

  • Gli FK non sono "indicizzati" per impostazione predefinita, quindi quali sono le considerazioni durante l'indicizzazione di un FK?

  • Come gestire i campi nullable che sono mappati come chiave esterna - è permesso?

  • Oltre all'indicizzazione, questo aiuta a ottimizzare i piani di esecuzione delle query in SQL Server?

So che c'è di più, ma preferirei che gli esperti ne parlassero. Per favore guidami.

È stato utile?

Soluzione

  • Le chiavi esterne non offrono vantaggi in termini di prestazioni o scalabilità.
  • Le chiavi esterne impongono l'integrità referenziale. Ciò può fornire un vantaggio pratico generando un errore se qualcuno ha tentato di eliminare le righe dalla tabella padre per errore.
  • Le chiavi esterne non sono indicizzate per impostazione predefinita. Dovresti indicizzare le colonne delle tue chiavi esterne, in quanto ciò evita una scansione della tabella nella tabella figlio quando elimini / aggiorni la riga principale.
  • È possibile rendere nulla una colonna di chiave esterna e inserire null.

Altri suggerimenti

Il vantaggio principale è che il database non risulterà incoerente se il codice del client difettoso tenta di fare qualcosa di sbagliato. Le chiavi esterne sono un tipo di "vincolo", quindi è così che dovresti usarle.

Non hanno alcun " funzionale " beneficio, non ottimizzeranno nulla. Devi ancora creare indici tu stesso, ecc. E sì, puoi avere valori NULL in una colonna che è una chiave esterna.

I vincoli FK mantengono coerenti i tuoi dati. Questo è tutto. Questo è il vantaggio principale. I vincoli FK non forniranno alcun guadagno in termini di prestazioni.

Ma, a meno che tu non abbia denormalizzato apposta la struttura db, ti consiglierei di usare i vincoli FK. Il motivo principale - coerenza.

Ho letto almeno un esempio in rete in cui è stato dimostrato che le chiavi esterne fanno migliorano le prestazioni perché l'ottimizzatore non deve eseguire controlli aggiuntivi su più tabelle perché sa che i dati soddisfano determinati criteri già dovuti all'FK. Spiacenti, non ho un link ma il blog ha fornito un output dettagliato dei piani di query per dimostrarlo.

Come accennato, sono per l'integrità dei dati. Qualsiasi prestazione "perdita" verrebbe completamente cancellato dal tempo necessario per correggere i dati non funzionanti.

Tuttavia, potrebbe esserci un vantaggio in termini di prestazioni indirette.

Almeno per SQL Server, le colonne nell'FK devono avere lo stesso tipo di dati su ciascun lato. Senza un FK, potresti avere un genitore nvarchar e un figlio varchar per esempio. Quando si uniscono le 2 tabelle, si ottiene una conversione del tipo di dati che può compromettere le prestazioni.

Esempio: diverse lunghezze varchar che causano un problema

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