Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    Query relazione 1 a molti

    Ho due tabelle:

    Tabella bambini
    id,nome,cognome,data di nascita ...

    Tabella genitori:
    id_bambino,nome,cognome,genitore,indirizzo ...

    Ora io per estrapolare il bambino con i nomi di entrambi i genitori faccio prima una query per il bambino e poi una query per trovare i due genitori che hanno l'id relativo al bambino,ma credo che la cosa si possa ottimizzare con una singola query.

    ho provato questa query:

    SELECT ab.nome AS nomebambino,ag.nome AS nomegenitore FROM anagrafica_bambini AS ab INNER JOIN anagrafica_genitori AS ag ON ab.id = ag.id_bambino where ab.id = '$_GET[id]'

    ma naturalmente avendo una relazione uno a molti non so come ricavare distintamente il nome della madre e il nome del padre.

    Naturalmente vorrei fare tutto su una query se ottimizzo l'esecuzione altrimenti con due query mi funziona perfettamente.

    Grazie

  2. #2
    Utente di HTML.it L'avatar di oronze
    Registrato dal
    Jun 2001
    Messaggi
    3,543
    SELECT DISTINCT? o non ho capito cosa ti serve?

    No ai layout tabellari!

    Insulto libero: http://forum.html.it/forum/showthread.php?s=&postid=12524872#post12524872

  3. #3
    In teoria è una relazione M:N

    Un bambino può avere 1 o + (max. 2 ovviamente ) genitori.

    Ed un genitore può avere 1 o + bambini.

    id_bambino nella tabella genitore non mi pare sensato.

    Ciao.

  4. #4
    cavolo hai ragione!!!
    non avevo pensato che ci possono essere + bambini con gli stessi genitori!!!

    cmq id_bambino è per legare il genitore al bambino,ma a questo punto credo che in fase di inserimento mi creerebbe record con genitori doppi.

    Qualche suggerimento per evitare questa cosa?

    Forse con una tabella a parte che mi lega id_bambino con id_genitore?

  5. #5
    Utente di HTML.it L'avatar di oronze
    Registrato dal
    Jun 2001
    Messaggi
    3,543
    non riesco a capire i problemi di inserimento che potresti trovare...
    BAMBINO
    id | nome | cognome |......
    GENITORE
    id | nome | cognome |.....

    questi io li userei come chiavi delle due tabelle...i genitori con id = sono il padre e la mamma del bambino...
    new genitore = (new id || id compagno/a), nome, cognome
    new figlio = (id genitore), nome, cognome
    non riresco a capire come potresti avere doppioni?

    No ai layout tabellari!

    Insulto libero: http://forum.html.it/forum/showthread.php?s=&postid=12524872#post12524872

  6. #6
    ti spiego come l'avevo concepito:

    io avevo una pagina in cui mettevo i dati del bambino,i dati del padre e poi della madre,poi avevo 2 tabelle in cui una c'erano in una i dati del bambino e nell'altra i dati di tuti i genitori e quindi i due record dei genitori con "id_bambino" che li legava al bambino in cui per distinguerli avevo messo un campo "genitore" in cui scrivevo se era il padre o la madre.

    Solo che non aveva pensato che potessere essere più bambini con gli stessi genitori e quindi se io,con la struttura che ho ora,devo inserire un nuovo bambino (fratello di qualcuno già presente) mi crea altri due record di genitori che fondamentalmente sono già presenti.

    Hai qualche consiglio da darmi sulla struttura del db?

  7. #7
    Per come la vedo io esiste una sola tabella "PERSONE" (tutti noi abbiamo un padre e una madre...tranne adamo ed eva forse) ed un'altra tabella per rappresentare le relazioni di PARENTELA:

    codice:
    CREATE TABLE persona (
      idpersona INT(11) NOT NULL auto_increment,
      nome VARCHAR(64) NOT NULL,
      cognome VARCHAR(64) NOT NULL,
      codicefiscale VARCHAR(15) NOT NULL,
      sesso ENUM('M', 'F') NOT NULL,
      ...,
      PRIMARY KEY idpersona,
      UNIQUE codicefiscale
    );
    
    CREATE TABLE parentela (
      idpersona INT(11),
      idgenitore INT(11),
      PRIMARY KEY (idpersona, idgenitore),
      FOREIGN KEY idpersona REFERENCES persona(idpersona),
      FOREIGN KEY idgenitore REFERENCES persona(idpersona)
    );
    poi potresti aggiungere una CHECK su "idgenitore" della tabella "parentela" per assicurarti che "idgenitore" ed "idpersona" nella tabella "parentela" siano diversi.

    E se proprio vogliamo puoi creare un ulteriore che ad ogni inserimento nella tabella parentela verifica che non esista già un "idgenitore" dello stesso sesso di quello che stai inserendo (non puoi avere due genitori maschi o due femmine).

    Spero di aver centrato il tuo problema
    Administrator of NAMDesign.Net

  8. #8
    Ottimo,non conoscevo il foreign key,me lo sono studiato un attimo ed è tutto chiaro,io per manterene le relazioni fra tabelle ho sempre fatto tutto a mano

    Ora stavo vedendo dal mio phpmyadmin che non mi crea tabelle con motore innodb.
    Non mi fa proprio vedere l'opzione nel menu a tendina quando creo la tabella.Comunque questo è un problema successivo.

    Quello che ti volevo chiedere ora era:

    1. Io avevo fatte due tabelle distinte perchè c'erano opzioni associate solo al bambino e se ora faccio una tabella unica ci saranno campi in più per i genitori che non verranno riempiti (questi campi sono tipo: id_aula,id_categoria,...).

    2. A livello di prestazioni/utilizzo credi sia meglio questa struttura che mi hai proposto o è la stessa cosa con quella che avevo pensato io?

    3. Dato che non ho mai utilizzato le foreign key,nella query per recuperare i dati cambia qualcosa o c'è qualche comando in più da utilizzare solo in caso di foreign key?

    4. Dalla tabella parentela come faccio a ricercare solo il bambino e non il genitore?

    Scusa se la tua soluzione mi ha generato tutte queste domande,ma come ti ho scritto non ho mai usato foreign key e se è un metodo migliore per usare mysql mi interesserebbe sfruttarlo.

    grazie

  9. #9
    Per create tabelle di tipo innodb basta fare (se la possibilità di creare innodb è attiva):
    codice:
    CREATE TABLE xxx (
      ...
      ...
    ) ENGINE=InnoDB;
    Se alcuni elementi della tabella "persone" hanno dati aggiuntivi puoi creare una tabella "extra" per rappresentare questi dati, ovviamente la tabella "extra" dovrà mantenere un riferimento all'id della persona:
    codice:
    CREATE TABLE extra (
      idextra INT(11) NOT NULL auto_increment,
      idpersona INT(11) NOT NULL,
      chiave VARCHAR(64) NOT NULL,
      valore VARCHAR(255) NOT NULL,
      ...
    );
    ovviamente la struttura della tabella "extra" dipenderà dalle tue esigenze; questa che ho proposto potrebbe andar bene per una serie di settaggi (chiave) conosciuti.
    Altrimenti mantieni divise le due tabelle "persona" e "bambini" anche se concettualmente lo trovo sbagliato dato che anche i "bambini" sono delle persone: giovani e senza figli.

    Per le prestazioni se inserisci dei buoni indici non credo avrai problemi ma non so la mole di dati che devi gestire ma se sono asintoticamente uguali come dimensione non hai differenze sensibili. Se tipo la tabella "persona" è 1000 voci e la tabella "bambini" è 300 voci, avendo quindi un rapporto, posto n=1000, di n/3 (1000 diviso 3 fa 333 che è bene o male la dimensione della tabella bambini) non hai differenze sostanziali. Ma se invece la tabella "persona" ha 1 milione di voci e sai che i "bambini" sono una radice cubica di quel valore (e quindi posto k il numero dei bambini avrai che ci saranno k^3, k al cubo, genitori avrai delle differenze).

    Per recuperare i dati devi utilizzare i vari tipi di JOIN.

    Per sapere se una "persona" è un bambino o meno devi verificare se il suo ID compare nella tabella "parentela" come "idgenitore":

    codice:
    SELECT *
    FROM persona
    WHERE idpersona NOT IN (
      SELECT idgenitore AS idpersona
      FROM parentela
    )
    con questa query selezioni tutte le persone che non sono dei genitori, quindi tutti i bambini. Ovviamente premettendo che la situazione di non avere "figli" stia a significare che non sono un genitore...poi bisogna vedere se questa è vera nel tuo caso!
    Administrator of NAMDesign.Net

  10. #10
    Ok,ti ringrazio molto,ho capito il concetto su cui basarsi quando creo strutture di DB.

    Quindi ho seguito il tuo consiglio creando un'unica tabella con le anagrafiche,una con le parentele ed una con le informazioni extra.

    In tutto questo ora sto ancora decidendo se utilizzare le FOREIGN KEY o no,comunque mi sei stato molto di aiuto.

    Grazie.

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.