5

Immaginate uno schema come tale.Scorciatoie da tastiera esterna nella tabella

NOTE TABLE:   NoteID, Note, DetailedTaskID, ..... 

DETAILED TASK TABLE: DetailedTaskID, WorkOrderID, ..... 

WORKORDER TABLE:  WorkOrderID, ProjectID, ..... 

PROJECT TABLE:   ProjectID, ..... 

Ora, con questo schema consente di dire che voglio recuperare tutte le note che sono associati ad un progetto specifico io alla fine con un certo numero di join.

IE: Note JOIN DetailedTask JOIN WorkOrder JOIN Project 

Quindi la mia domanda è questa, quando (se mai) è opportuno aggiungere una colonna "scorciatoia" per una tabella (in questo caso ProjectID)?

Quindi, fondamentalmente cambiando la tabella di nota a questo: NoteID, nota, DetailedTaskID, ProjectID

risposta

7

Risposta breve: mai, mai, mai. risposta

più lunga: Solo quando:

  1. volta stabilito che le prestazioni dei join è inaccettabile (che raramente è vero).

  2. Hai davvero esaurito tutte le alternative meno pericolose.

  3. si è disposti ad assorbire il lavoro supplementare coinvolti nel mantenere il, informazioni ridondanti de-normalizzato in sincronia

  4. Siete disposti ad accettare il fatto che allora diventa tecnicamente possibile per il database per restituire risultati non corretti se non riesci a mantenere le cose sincronizzate.

+0

Posso solo confermare? Quando dici "meno pericoloso" presumo tu intenda uno scenario in cui un bug può far sì che una chiave straniera punti a un progetto e l'altra a un altro, giusto? –

+0

Proprio così. In questo caso una svista nel codice (o nel codice di qualcun altro, aggiunto in seguito) potrebbe aggiornare le chiavi esterne in una tabella e non nell'altra. Oppure, potrebbe aggiornare solo alcuni dei valori delle chiavi esterne de-normalizzati nelle righe nella seconda tabella, ma non in altre. Oppure potrebbe aggiornare troppe righe nella seconda tabella. E potresti non vedere subito questi errori, o in modo coerente, se a volte stai ottenendo i valori delle chiavi esterne dalla tabella normalizzata e talvolta dalla tabella denormalizzata. Può essere fatto, ma assicurati di avere una reale necessità di farlo prima. –

+0

Grazie mille per il tuo contributo ... –

1

cosa si sta parlando si chiama una relazione di chiave esterna. È la base per Data Normalization. In breve, aggiungere una relazione di chiave esterna (ProjectID) alla tabella delle note se una nota (ad esempio NoteID) appartiene a un progetto.

I vantaggi di fare questo sono così che si può interrogare questi dati relazionali, in questo modo:

select 
    Note.*, 
    Project.* 
from Note 
left join Project 
on Note.ProjectId = Project.ProjectId 

Quella interrogazione produrrebbe tutte le note ei dati del progetto (se è parte di un progetto) che è collegato ad esso.

Problemi correlati