Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [mysql] una tabella e due sottotabelle

    Ciao,
    lasciando stare il titolo pazzesco, sono in questa situazione: ho un utente del quale devo specificare la tipologia di studi, attraverso un elenco (dalla scuola media al master) in un menu a tendina, ognuno associato ad un valore. La scuola media avrà valore 1, il liceo 2 e così via.
    Fin qui è facile, prendo il valore associato e lo memorizzo nel database nella tabella relativa all'utente (campo "studi").
    Il problema è con le lauree, voce che richiede un secondo menù elencante tutte le varie facoltà.
    La mia immaginazione mi ha portato a pensare ad un doppio valore per il campo "studi", che prevede questo (un esempio):

    5-1

    Il primo numero è lo studio, 5 equivale a laurea triennale e il secondo è la facoltà, per esempio Architettura. Nel caso non abbia scelto una laurea, il valore sarà

    1-0

    il secondo valore è appunto 0 perchè non c'è nessuna laurea da specificare.
    Capisco che sia un po' una grezzata, vorrei sapere cosa ne pensate voi.
    Vi ringrazio di cuore

  2. #2
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Uhm mi suona tanto da relazione.

    Se ho capito bene hai una cosa come :

    tabella studenti
    id
    nome
    dati vari

    tabella studi
    id
    dati

    Fin qua ok, poi iniziano i dubbi.
    Gli studi di uno studente possono essere anche quelli di altri studenti?
    Io credo di si visto che scuola media / superiore ingegneria informatica etc possono essere assegnati a piu' utenti.
    Se e' cosi la relazione tra le tabelle diventa una relazione molti a molti e richiede l'apposita tabella di relazione.
    Quindi io aggiungerei la tabella

    studenti_studi
    id_studente
    id_studio

    primary key(id_studente , id_studio)// per evitare le replicazioni

    Quindi ti basta fare una query con sottoselect o join per recuperare tutti i dati degli studi di uno studente.
    Inoltre puoi recuperare per esempio tutti gli studenti con scuola superiore, media, un certo tipo di ingegneria etc.

    Nella select box quindi puoi inserire tutti gli studi dell'utente senza dover impazzire.
    Nel caso un certo corso di studi non esiste si puo' facilmente inserire nella tabella generica, per esempio master di questo o di quello etc.
    Magari puoi esendere la tabella e categorizzare ma questo e' gia' oltre.


    Secondo me una sol di questo genere ti consente di gestire le cose al meglio.
    Per esempio:
    Voglio tutti gli studenti con master in telecomunicazioni

    select
    *
    from
    studenti_studi
    where
    id = $id

    Ovviamente questa ti restituisce solo le chiavi. ma la puoi esentendere cosi'

    select
    stud.*
    from
    studenti_studi ss,

    left join
    studenti stud
    on
    ss.id_studente = ss.id

    where
    ss.id = $id

    e cosi' ti carichi la tabella degli studenti che cercavi.

  3. #3
    Ciao Virus_101,
    grazie innanzitutto della risposta molto completa che già mi ha chiarito un po' le idee.

    Ebbene sì, è possibile avere più di un utente che per esempio ha fatto il liceo scientifico (è naturale).
    La tua soluzione infatti va bene nel caso le tabelle si fermassero a due, ovvero

    tabella studenti

    tabella studi



    Il problema è che, come dicevo all'inizio, gli studi universitari prevedono una sottotabella, ovvero il tipo di laurea.
    In altre parole faccio un esempio:

    Utente a -> liceo scientifico (qui nessun problema)
    Utente b -> laurea triennale (e qui entra il sottolivello) -> architettura.


    Secondo il tuo modello avrei dunque bisogno di una terza tabella per le lauree, dico bene? Tabella che tra l'altro non userei spesso perchè non tutti gli utenti sono laureati.
    Correggimi se sbaglio

  4. #4
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Allora dipende quanto vuoi complicarti la vita.

    Se vuoi gestire le tipologie di studi come categorie puoi usare varie soluzioni, una di queste e' usare una tabella ricorsiva( per intenderci con una colonna che fa riferimento alla tabella stessa ) per gestire le sottocatergorie. Ovviamente devi usare funzioni ricorsive per scorrere le varie categorie/sottocategorie.

    Senno a mio avviso a questo punto puoi usare una soluzione diversa e piu' versatile come inserire una'altra tabella dove ti salvi i dati aggiuntivi.

    Il problema a sto punto diventa che bisogna invertire un po di roba.
    io farei.
    (ti metto dentro codice php cosi mi mantiene l'identazione)
    Codice PHP:
    Sql

    create table studenti
    (

        
    id int auto_increment not null,

    -- 
    DATI VARI DELLO STUDENTE
    -- .....

        
    primary key(id)
    );


    create table studi(

        
    id int auto_increment not null,

    -- 
    DATI STUDI

        corso    text
    ,

        
    primary key(id),

    );

    create table sottotipi(

        
    id int auto_increment not null,

    -- 
    DATI STUDI

        corso    text
    ,
        
    note     text,

        
    primary key(id),

    );

    /*
    Come vedi ho aggiunto una tabella "sottotipi" nella quale andremo ad inserire i 
    vari sottotipi di studio e la gestiremo con la stessa relazione molti a molti che aveva 
    fatto prima.
    Cosi a sto punto uno studio puo' possedere piu' sottotipi e uno stesso sottotipo puo' 
    essere riutilizzato in studi diversi.

    Quindi ora inseriamo le tabelle di relazione.

    Nota: ora inseriamo anche qlke campo aggiuntivo nella tabella di relazione che ci 
    consente di estendere le tabelle con i dati relativi alle votazioni note etc 
    */

    create table studenti_studi(

        
    id_studente int not null,
        
    id_studio     int not null,

        
    votazione varchar(50),
    -- 
    altri eventuali dati 
      
        primary key
    (id_studente id_studio),

        
    foreign key (id_studentereferences studenti(id)
        
    ON DELETE NO ACTION ON UPDATE NO ACTION,

        
    foreign key (id_studioreferences studi(id)
        
    ON DELETE NO ACTION ON UPDATE NO ACTION

    );


    create table studi_sottotipi(

        
    id_sottotipo int not null,
        
    id_studio     int not null,

    -- 
    altri eventuali dati 
      
        primary key
    (id_sottotipo id_studio),

        
    foreign key (id_sottotiporeferences sottotipi(id)
        
    ON DELETE NO ACTION ON UPDATE NO ACTION,

        
    foreign key (id_studioreferences studi(id)
        
    ON DELETE NO ACTION ON UPDATE NO ACTION

    ); 
    Come vedi ora abbiamo esteso il database inserendo tutti i dati che ci servivano senza dover necessariamente apportare modifiche pesanti alla tabelle precedentemente usate.
    Io reputo questa una buona soluzione che ti consetira' di estendere in futuro la base di dati.
    Ionltre ti consente di fare tutte le ricerche che ti servono come caricare tutti gli studenti con un certo master controllare quanto maschi hanno un laurea + abilitazioni varie etc etc.
    Ovviamente le query non saranno proprio immediate ma con qlke join risolverai i problemi e costruendo le query bene potri davvero fare di tutto.



    Edit:
    Ovviamente l'sql per la creazione delle table e' puramente un esempio potrebbe non funzionare.
    Inoltre dopo ti consiglio di usare le foreign key con qlke action tipo cascade cosi' eviti la permanenza di dati incoerenti nella tab di relazione.
    Ciauz de nuevo.

  5. #5
    Giusto Virus, in questo modo ti fai tre tabelle una per ogni "entità": lo studente/utente, gli studi e le lauree.
    L'unica sfiga è che così può capitare di usare poco la tabella lauree, nel caso non ci sia nessun laureato, ma non credo sia un grosso problema.
    Io ti ringrazio ancora per la completezza dei tuoi suggerimenti, mi hanno davvero fatto chiarezza sulla situazione.
    Concludo chiedendoti se la soluzione a tre tabelle da te proposta può essere in qualche modo più pesante per il database, che deve farsi un po' di query in più per ricavare le info.

  6. #6
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Beh sicuramente e' "piu' pesante" rispetto ad una unica tabella.
    pero' ti consente di tenere separate le entita' che usi e la base di dati e' normalizzata.
    Cosi' facendo eviti inutili replicazioni di dati e riesci a mettere piu' informazioni usando uno spazio minore rispetto ad una unica tabella.
    Certo le query possono risultare piu' complesse ma ti danno la possibilita' di gestire i dati con maggiore flessibilita' e le ricerche le puoi fare tranquillamente in base a qualsiasi criterio.
    Inoltre questa forma normalizzata ti consente di mantenere la coerenza dei dati.

    Ultima nota, nel caso tu volessi velocizzare le ricerche o semplificarti le query puoi usare la "create view", questo comando ti crea una tabella virtuale nel db che puoi querare come una tabella normale, ogni volta che fai operazioni sulle tabelle base tale tabella viene aggiornata quindi nel caso ti puoi fare una cosa del genere

    create view studenti_laureati as select * from studenti_studi left join .......

    e poi select * from studenti_laureati

    la documentazione relativa alla create view la trovi qui .

    Pensaci, in effetti con le view ti puoi creare delle entita' che effettuano gia' la query e tu semplicemente scarichi la tabella formattata di dati.
    Ovviamente le view risiedono in memoria del db e a riavvio del server vanno ricreate, nel caso ti fai un paio di funzioni php che controllano se le view esistono e se non esistono le fai creare.

    Alla prox ciauz.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.