2012-08-08 12 views
10

Sto progettando una struttura di database con il seguente esempio semplificato:È errato avere "ridondanza di chiave esterna" in un database?

Team has many members 
Member has many clients 
Client has many projects 

Supponendo miei oggetti hanno questi parametri:

Team: id, type 
Member: id, team_id, name 
Client: id, member_id, email 
Project: id, client_id 

E 'abbastanza semplice da trovare cliente di un progetto, o un membro di un cliente, o la squadra di un membro.

Tuttavia, supponendo di voler trovare il team di un progetto, ad esempio, devo prima trovare il cliente di un progetto, poi il membro di un cliente e poi il team del membro.

potrei aggiungere un team_id direttamente al progetto, in questo modo:

Project: id, client_id, team_id 

Mi rendo conto, tuttavia, questo aggiunge un certo livello di ridondanza in quanto tale informazione è a disposizione dalla "risalendo l'albero rapporto ". È una cattiva idea?

Grazie!

+0

Non intendi "ogni membro del team ha molti clienti" e "il cliente di ogni membro del team ha molti progetti"? –

+0

Cosa considera "ridondanza dannosa"? Stai parlando dello stesso tipo di "ridondanza dannosa" di cui si occupa la teoria della normalizzazione? O è la tua misura di ciò che è "dannoso" una misura diversa? –

risposta

2

Se questa è una cattiva idea o meno dipende dai casi d'uso tipici per il database.

L'aggiunta di chiavi esterne aggiuntive aumenta il costo di modifica della struttura (INSERT, UPDATE se si modificano le relazioni, DELETE).

Non con le chiavi esterne aggiuntive aumenta il costo delle query che altrimenti beneficerebbero della loro presenza.

Se la struttura del progetto non cambia molto ma si effettua una query frequente sulla struttura, è probabile che la chiave esterna aggiuntiva sia positiva. In caso di dubbio, crea la struttura con dati di test ragionevoli e confronta alcune query che ritieni siano tipiche.

+0

Non è necessario aggiungere FK. Puoi semplicemente creare il composito FK. –

+0

Tuttavia, più grandi sono le chiavi gestite, più lenti sono gli aggiornamenti. Anche se si dispone di una chiave più ampia, verranno comunque inseriti meno tasti in una pagina del disco e sarà possibile memorizzare un numero inferiore di chiavi nella RAM disponibile. –

1

Non è che devi fare 4 query qui. Basta fare un join che unisce tutte le tabelle in una singola query. Questo non aggiunge molta complessità, ma aggiunge un po '. Vorrei solo andare con quello che hai.

Problemi correlati