Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    183

    [MySQL] Consiglio su come strutturare un DB

    Vorrei chiedere un consiglio su come sarebbe meglio realizzare un database e vi ringrazio già in anticipo per il vostro aiuto.
    Inizierei subito con un semplice esempio per meglio spiegare cosa dovrei realizzare.

    Immaginate di avere un elenco di persone con le rispettive date di nascita e di morte.
    Ovviamente se la persona è ancora in vita sarà nota la sola data di nascita.

    Il sito web/programma, leggendo i dati dal DB, dovrebbe 'semplicemente' essere in grado di visualizzare due tipi di schermate.

    Nella prima l'elenco delle persone con a fianco le due date (mostrando la scritta 'in vita' se manca la data di morte).
    L'elenco potrà essere poi ordinato per nome della persona, per data di nascita o di morte.

    Nella seconda schermata saranno elencati gli eventi cronologici di nascita e morte in ordine cronologico:
    esempio
    01/01/1900 nasce mario rossi
    02/02/2000 nasce luca bianchi
    08/01/2001 muore maria verdi

    Scritta questa lunga premessa, vi chiedo come andreste a strutturare il relativo database.

    Nel caso si decidesse di utilizzare una sola tabella con campi (nome,data1,data2) trovo più complicato andare ad estrapolare la seconda schermata sopra riportata.

    Nel caso si creasse due tabelle: tabella1 = (id_evento, data) ; tabella2 = (persona, id_nascita, id_morte) sarebbe più complicato estrapolare i dati per la prima schermata.

    Quale sarebbe la decisione più corretta, performante e 'professionale' ?

    Grazie

  2. #2
    Ciao,

    premesso che mettendo tutto in un unica tabella a primo acchitto non mi vengono soluzioni per tutte e due le domande.

    Consideriamo la Nascita e la morte come due eventi. Cosi facendo la persona puo avere piu eventi.

    Strutturerei le due tabelle cosi :

    Persona (idP,Nome)
    Evento (idEv,NomeE,Data,idP)

    potrebbe accadere che due persone nascano e muoiano nello stesso giorno ma metterei due record diversi distinguendoli per idEv e mi terrei la relazione 1:N

    In questo modo :

    Per rispondere al primo quesito :

    codice:
    SELECT P.NOME, E.DATA, E.NOMEE
    FROM PERSONA P JOIN EVENTO E ON(P.IDP=E.IDP)
    Per rispondere al secondo quesito :

    codice:
    SELECT E.DATA, E.NOMEE, P.NOME
    FROM EVENTO E JOIN PERSONA P ON(E.IDP = P.IDP)
    ORDER BY(E.DATA)
    Non si può risolvere un problema usando lo stesso modo di pensare che ha creato quel problema.
    Albert Einstein

    Siate Affamati, siate Folli, siate Onesti e siate Generosi

  3. #3
    per la seconda

    SELECT ...
    (select nascita ...
    union
    select morte ...
    ) order by ...

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    183
    caro bomberdini:

    Anche io opterei più per la creazione di due tabelle.

    Da informatico autodidatta, nel caso però di una sola tabella, farei una cosa che forse un vero informatico giudicherà poco ortodossa:
    con una prima query estrapolerei nome e data di nascita e inserirei i risultati in un vettore (array).
    Poi, con una seconda query, prendo nome e data di morte e inserirei il tutto nello stesso vettore.
    Poi ordinerei (sort) per data il vettore lo visualizzerei.

    In questo caso si avrebbe un database di dimensione inferiore (una sola tabella) ma il tempo per estrapolare i dati sarebbe (credo) più lungo.
    Ci sarà una sola tabella però questa avrà molti campi vuoti (nel caso la persona sia in vita, il campo data di morte sarà vuoto).

    Utilizzando due tabelle si avrà un database di dimensioni maggiori.
    Il tempo di ricerca dati dovrebbe essere però più veloce.
    Inoltre le tabelle non presentano campi vuoti.

    Sono corrette le mie considerazioni?

    Grazie ancora

  5. #5
    senza passare per array e altre cose di programma, con la mia query fai tutto da db. l'hai provata?

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    183
    caro optime:
    la tua risposta non mi era del tutto chiara (forse colpa mia che ho formulato male troppe domande). scusami.

    Tu quindi utilizzeresti una sola tabella e con la query che hai proposto saresti in grado di visualizzare l'elenco della cronologia degli eventi (nascita e morte in una sola colonna)?

    Non conosco e non ho ancora utilizzato query del tipo unione. Farò dei tentativi.

    Grazie

  7. #7
    Originariamente inviato da iorso
    caro bomberdini:

    Anche io opterei più per la creazione di due tabelle.

    Da informatico autodidatta, nel caso però di una sola tabella, farei una cosa che forse un vero informatico giudicherà poco ortodossa:
    con una prima query estrapolerei nome e data di nascita e inserirei i risultati in un vettore (array).
    Poi, con una seconda query, prendo nome e data di morte e inserirei il tutto nello stesso vettore.
    Poi ordinerei (sort) per data il vettore lo visualizzerei.

    In questo caso si avrebbe un database di dimensione inferiore (una sola tabella) ma il tempo per estrapolare i dati sarebbe (credo) più lungo.
    Ci sarà una sola tabella però questa avrà molti campi vuoti (nel caso la persona sia in vita, il campo data di morte sarà vuoto).

    Utilizzando due tabelle si avrà un database di dimensioni maggiori.
    Il tempo di ricerca dati dovrebbe essere però più veloce.
    Inoltre le tabelle non presentano campi vuoti.

    Sono corrette le mie considerazioni?

    Grazie ancora
    Ciao,

    lascerei perdere array e cose varie...

    Utilizzerei tranquillamente due tabelle cosi da avere le tabelle relazionate e un minimo normalizzate

    i tempi non so se sono un problema dovresti avere tabelle molto grandi e non so se e' il tuo caso.

    Secondo me la strada delle 2 tabelle relazionate e' la piu' corretta formalmente
    Non si può risolvere un problema usando lo stesso modo di pensare che ha creato quel problema.
    Albert Einstein

    Siate Affamati, siate Folli, siate Onesti e siate Generosi

  8. #8
    bombe. io capisco la pulizia intellettuale delle due tabelle, ma per gestire due-eventi-due, fissi e ineluttabili (nascita e morte) non ti pare troppo? a meno che il numero di eventi gestiti non sia destinato a crescere (come tipo, ovvio, si nasce e si muore una volta sola )

  9. #9
    diciamo che questo e' un caso molto boardline.

    si potrebbero usare entrambe le soluzioni, ma supponendo il caso peggiore con veramente tanti record dove magari pochi sono morti con un a sola tabella occuperesti spazio su data di morte, o lasciandolo vuoto o mettendo date fittizzie tipo 31/12/9999.

    Nel caso invece delle 2 tabelle solo nel caso di morte andrai a creare un nuovo evento morte.

    Sicuramente entrambe le soluzioni funzionano. Io farei con 2 tabelle per un discorso di buona progettazione ma giustamente non devo farlo io sara lui a scegliere
    Non si può risolvere un problema usando lo stesso modo di pensare che ha creato quel problema.
    Albert Einstein

    Siate Affamati, siate Folli, siate Onesti e siate Generosi

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    183
    Ci tengo a precisare che il mio era solo un esempio 'stupido' per far comprendere il tipo di problema 'strutturale'.
    Nella realtà potrebbero essere presenti molti più campi.
    Dalla discussione che è nata apprendo comunque che la soluzione più corretta dal punto di vista accademico è quella di avere (nel caso dell'esempio proposto) due tabelle distinte.

    Ciao a tutti

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.