Chiave esterna, meglio aggiungere un id intero? | Progettazione di DataBase Relazionali

Topic: Pubblico - Composto da 4 Posts di 2 Utenti.

22 Novembre, 2011 15:14 #1
mariselli
Utente

mariselli
Registrato: Nov, 2011
Posts: 2
Offline

Salve a tutti! Sono nuovo del forum.
Oggi all'università ho posto un dubbio al docente che non mi ha saputo risolvere.

Il mio caso è il seguente:
Tabella file:
id_file (unsigned int)(chiave univoca)
nome_file (varchar)
tipo (unsigned int)(in relazione N:1 con tipo_file.id_tipo)
[...]

Tabella tipo_file:
id_tipo (unsigned int)(chiave univoca)
nome_tipo (varchar)(in relazione 1:N con file.tipo)

Il mio dubbio è:
Conveniva direttamente mettere l'attributo "tipo" della tabella "file" come varchar e mettere direttamente dentro la stringa contentente il nome del tipo?

A senso a me sembrerebbe un cosa brutta avere la tabella con tante volte scritto "image/jpg" o altro e mi sembrava più appropriato mettere i tipi in una tabella esterna. I vantaggi che vedo sono appunto il fatto di poter cambiare il valore del nome del tipo senza toccare la tabella file e aver una migliore performance nelle query.

Il docente mi ha suggerito l'ipotesi di creare un dominio con i vari tipi.

Che ne pensate??

22 Novembre, 2011 18:28 #2
g2d
Moderatore

g2d
Registrato: Jul, 2008
Posts: 957
Offline
Segui g2d su Twitter!

Benvenuto su MySQL Italia,

In generale in questi casi la cosa migliore è sempre usare una tabella come tipo_file perchè così centralizzi questa cosa ed è più manutenibile e poi se la join la fai secca su una tabella di pochi elementi non ti intacca le performance.. in più pensa allo spazio che risparmi... mi rendo conto che oggi risparimiare pochi byte a riga sembra una scemenza... ma se l'applicazione cresce veramente quei pochi byte diventano centinaia di Megabyte e ogni volta che devi lavorare con il DB ad esemio con Backup, Migrazioni e manutenzione varie quei centinaia di MB che avrai in più ti peseranno.

Migliori sono i dati migliore sarà la tua vita eheheh

che ne pensi ?


Un tempo ero algweb ora sono g2d

23 Novembre, 2011 13:30 #3
mariselli
Utente

mariselli
Registrato: Nov, 2011
Posts: 2
Offline

Grazie della risposta!!
Io anche la penso così! Parlando in classe però ci sono persone che non sono daccordo, o meglio non si sentono di poter affermare la stessa cosa.
C'è chi propone come idea quella di mantere "tipo" nella tabella "file" come campo stringa mettendo l'effettivo valore (es. 'image/jpg') e metterlo in relazione di chiave esterna con una tabella dei tipi dovre riportare sempre i nomi dei tipo (es. 'image/jpg','image/png'). A me sembrerebbe altemente inutile in quanto c'è un grande spreco di spazio. Le motivazioni dei miei compagni erano che comunque avendo una tabella esterna con relazioni si potevano gestire meglio i cambi di vaolre del tipo con gli ON UPDATE CASCADE ed evitare i JOIN.

Una delle cose che criticavano della mia idea di mettere come chiave di relazione un intero era in primis che nello schema ER non salta fuori da nessuna parte questo attributo intero e in secondo luogo che non sappiamo poi come il dbms gestisca questi valori (cioè "salva davvero il dato come intero??") e quindi non sappiamo se effettivamente è più veloce la ricerca su chiave intere e se poi alla fine la tebella dato che si usano chiavi intere occupi meno spazio di una con le chiavi stringa.

Spero di aver reso l'idea!!!

Grazie in anticipo!

06 Dicembre, 2011 19:27 #4
g2d
Moderatore

g2d
Registrato: Jul, 2008
Posts: 957
Offline
Segui g2d su Twitter!

Ciao e scusa se rispondo solo ora ma nn me ne ero accorto.. :-(

guarda solo provando le cose avrai le risposte..

EXPLAIN it!

Prova a fare le cose, fai uno scrippetino che ti carica 500mila record e fati i test.. poi con i dati alla mano cambia tutto.


Un tempo ero algweb ora sono g2d

Condividi su:

Loggati o Registrati per replicare