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

    [SQL] tabelle che si riferiscono a se stesse. come fare?

    salve

    ---> immaginate di avere questa tabella

    PROGETTI ( id_progetto, titolo )

    un tipico elemento potrebbe essere: [ 1 ; "costruire una barca" ]

    ma alcuni progetti sono in realtà sotto-progetti di altri progetti. per esempio, il progetto 1 e' costituito da tre sotto-progetti [ 2 ; "costruire lo scafo" ] , [ 5 ; "cucire la vela" ] , [ 6 ; "reperire un salvagente" ]

    e potremmo continuare, dicendo che il progetto 2 e' formato dai sotto-progetti [ 3 ; "trovare il legno" ] e [ 4 ; "trovare i chiodi" ]

    ---> esistono centinaia di queste evenienze!

    per esempio la tabella meccanismi, dove ogni meccanismo puo' avere dei sotto-meccanismi.
    oppure la tabella reparti all'interno di un'organizzazione, etc...

    ---> come si gestiscono queste evenienze?

    ipotesi 1: agendo sulla tabella stessa
    PROGETTI ( id_progetto, titolo, fk_progetto_padre )
    dove progetto padre punta ad un altro progetto nella tabella stessa, oppure e' vuoto / NULL

    ipotesi 2: creando un'apposita tabella
    PROGETTI ( id_progetto, titolo )
    PROGETTI_GERARCHIA ( fk_progetto_padre, fk_progetto_figlio )

    o cosa???

    grazie a chiunque vorrà intervenire...
    si vivono molte vite e si muore una volta sola

  2. #2
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    Credo che il tuo caso si conformi in quello della gestione delle categorie di un albero.

    Esistono diversi algoritmi per fare quello che chiedi, purtroppo non ho sottomano gli articoli che lessi tempo fa.

    Diciamo che quello più semplice è quello di aggiungere un campo "genitore", se questo vale zero vuol dire che il progetto/categoria non ha genitore, quindi è di primo livello, mentre se questo campo avrà un valore dovrà essere l'id della categoria immediatamente superiore.

    Per poter leggere l'albero completo dovrai scrivere una funzione ricorsiva (e cioè che richiama se stessa passando l'id del ramo in esame, e che ti restituisce l'id del genitore, se questo non vale zero richiama nuovamente se stessa).

    Se conosci un po' di inglese prova a cercare "manage hierarchy php mysql" in google e troverai diversi articoli..

    ciao

  3. #3
    ciao gianiaz, ti ringrazio moltissimo per la risposta.

    la quale mi ha fatto riflettere su un altro punto che non avevo considerato:

    - se ci fossero sotto-progetti condivisi da diversi progetti padre?
    - se un progetto avesse come "avo" se stesso? [questa eventualità credo sia tutta da evitare,,,che usi puo' avere mai?]

    grazie al tuo consiglio ho trovato questa magnifica guida, in inglese:
    http://dev.mysql.com/tech-resources/...ical-data.html
    si vivono molte vite e si muore una volta sola

  4. #4
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    Originariamente inviato da dogeht
    ciao gianiaz, ti ringrazio moltissimo per la risposta.

    la quale mi ha fatto riflettere su un altro punto che non avevo considerato:

    - se ci fossero sotto-progetti condivisi da diversi progetti padre?
    Purtroppo qui la cosa si complica, per ogni relazione molti a molti devi aggiungere una tabella di collegamento, a quel punto anzichè collegare con il campo della stessa tabella dovresti andare a controllare che esista in uno dei record della tabella di relazione "elemento - genitori".
    - se un progetto avesse come "avo" se stesso? [questa eventualità credo sia tutta da evitare,,,che usi puo' avere mai?]
    Questo io in genere lo evito via php, cioè precludendo all'utente la possibilità di scegliere come genitore se stesso, anche perchè se usi una funzione ricorsiva questo caso manderebbe tutto in un loop infinito.

    grazie al tuo consiglio ho trovato questa magnifica guida, in inglese:
    http://dev.mysql.com/tech-resources/...ical-data.html
    Ora me la segno

    Ciao

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 © 2024 vBulletin Solutions, Inc. All rights reserved.