normalizzazione database

Ciao a tutti, mi chiamo Francesco ed è la prima volta che scrivo in questo forum, sono appassionato di informatica ma sempre autodidatta, ora mi sono imbattuto in un problema, vorrei creare un database ad albero tipo questo

materie:

            -fisica -moti -uniforme

                                -accelerato

                                -ecc...

                       -energia -potenziale

                                     -cinetica

                       -termodinamica -ecc...                       

             -matematica .....

             -meccanica .....

inizialmente avevo creato un database con una tabella con:

id-materia-argomenti-descrizione

ma una dopo aver riflettuto un po su non fa al caso mio perchè se elenco gli argomenti di una materia vengono elencati tutti gli elementi di quella tabella (quindi non è ad albero)

leggendo su internet ho visto che devo fare più tabelle e usare le foreign key e qui c'è il problema...

Secondo voi puù andar bene un database con 3 tabelle?

TABELLA MATERIE

ID_materia

Materia

TABELLA ARGOMENTI

ID_Mat

ID_Agomento

Argomento

TABELLA DESCRIZIONE

ID_arg

ID_Descrizione

Descrizone

cosi facendo potrei dargli questa struttura:

1 Fisica    -1 1 moti      -1 1 xxx

               -1 2 xxx

               -1 3 xxx

      -1 2 energia      -2 1 zzz

               -2 2 zzz

               -2 3 zzz

      -1 3 termodinamica   

secondo voi sono sulla strada giusta?

inviato 6 anni fa
kikko088
X 0 X

Benvenuto sul forum kikko.  O0

Perché hai scelto di dividere gli argomenti dalle descrizioni?

 :bye:

risposto 6 anni fa
Gianni Tomasicchio
X 0 X

Ho deciso di dividerle per avere più ordine, tipo nel primo caso

materie:

            -fisica -moti -uniforme

                                -accelerato

                                -ecc...

se non avessi gli argomenti avrei una cosa cosi

materie:

            -fisica -uniforme

                      -accelerato

                      -ecc...

che non mi piace molto, visto che avrò molti argomenti vorrei suddividerli per pagina in modo da non avere una pagina lunghissima con tutti gli argomenti.

kikko088

risposto 6 anni fa
kikko088
X 0 X

Quindi i tre livelli in cui hai organizzato i contenuti sono categoria, sottocategoria e pagina, giusto? Se è questo quello che vuoi ottenere allora la struttura delle tabelle è corretta.

 :bye:

risposto 6 anni fa
Gianni Tomasicchio
X 0 X

Si è cosi che mi serve!grazie mille, potrei chiederti ancora una cosa?in teoria dovrei usare le foreign key per collegare alcuni campi, secondo te come dovrei usarle?in modo da avere questa gerarchia?

TABELLA MATERIE

ID_materia (primary key ?)

Materia

TABELLA ARGOMENTI

ID_Mat

ID_Agomento (primary key ?)

Argomento (primary key ?)

TABELLA DESCRIZIONE

ID_arg

ID_Descrizione (primary key ?)

Descrizone

1 Fisica    -1 1 moti      -1 1 xxx

               -1 2 xxx

               -1 3 xxx

      -1 2 energia      -2 1 zzz

               -2 2 zzz

               -2 3 zzz

      -1 3 termodinamica

risposto 6 anni fa
kikko088
X 0 X

TAB_MATERIA

ID (PK)

DESC_MATERIA

TAB_ARGOMENT0

ID (PK)

ID_MATERIA (FK references TAB_MATERIA.ID)

DESC_ARGOMENTO

TAB_DESCRIZIONE

ID (PK)

ID_ARGOMENTO (FK references TAB_ARGOMENT0.ID)

DESCRIZIONE

 :bye:

risposto 6 anni fa
Gianni Tomasicchio
X 0 X

perfetto!grazie mille, ora vediamo cosa combino :D

potrei chiederti un'ultima cosa?

Se io invece di questo database ne avessi uno unico, con ID MATERIA ARGOMENTO DESCRIZIONE

posso fare una visualizzazione gerarchica come descritto sopra?utilizzando solo delle query WHERE/AND? è una curiosità perchè è la soluzione che mi ha proposto una persona e sto cercando di valutare quale sia la più semplice vista la mia poca conoscenza in materia... :(

kikko088

risposto 6 anni fa
kikko088
X 0 X

Normalmente si possono fare le stesse cosa sia se un database è normalizzato, sia se non lo è. La vera differenza sta nel fatto che il database non normalizzato deve contenere inevitabilmente molti valori ripetuti nei diversi record e questo, oltre allo spreco di memoria, mette a rischio la consistenza dei dati.

Ad esempio se devi cambiare la descrizione di un argomento (o peggio ancora di una materia) sei costretto a cambiarla su tutti i record in cui compare. Che succederebbe se qualche record non venisse aggiornato? Avresti uno stesso id argomento associato a diverse descrizioni, alcune vecchie e altre nuove.

 :bye:

risposto 6 anni fa
Gianni Tomasicchio
X 0 X

capito!quel problema penso che sarebbe il meno per l'uso del database però è meglio averlo normalizzato a questo punto, quando faccio la query posso utilizzare al suo interno delle variabili?tipo un WHERE id=(variabile) ?senza entrare nel linguaggio di programmazione che sto usando vorrei solo chiederti un consiglio se sono sulla giusta strada, sto facendo un programma dove vengono visualizzato il databse, io pensavo di fare in una pagina una query che mi visualizza tutte le materia poi un'altra query dove gli passo un valore (il pulsante premuto) e vengono elencati gli argomenti, poi stessa cosa con la descrizione, solo che questo procedimento può funzionare solo se posso usare la variabile all'interno della query

come vedi sono proprio ignorantissimo in materia :D

risposto 6 anni fa
kikko088
X 0 X

Certo che puoi usare variabili nelle query. Dipende poi dal linguaggio, dalle librerie, ecc. come realmente si realizza il passaggio delle variabili.

 :bye:

risposto 6 anni fa
Gianni Tomasicchio
X 0 X

ok perfetto!grazie mille....ora provo a "elaborare" un po ciò che ho in testa :D

kikko088

risposto 6 anni fa
kikko088
X 0 X

Se vuoi fare un vero albero, una scelta quasi obbligata è l'implementazione nested set.

Trovi una buona guida (in inglese) qui http://dev.mysql.com/tech-resources/articles/hierarchical-data.html

risposto 6 anni fa
Massimiliano Arione
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda