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

    Logica ParentID, profondità nodi

    Salve,

    Vorrei ottenere la seguente struttura per un mio cms:

    articolo1
    >articolo2
    >>articolo3
    >>>ect..

    quindi articolo1 possiede articolo2 (o più) che a sua volta contiene uno o più figli e cosi via..
    inoltre ad ogni articolo sono associate una o più immagini.
    come devo strutturate il database?
    quante tabelle dovrei creare e come dovrei relazionarle in modo efficace?

  2. #2
    Utente di HTML.it L'avatar di wallrider
    Registrato dal
    Apr 2003
    Messaggi
    2,755
    ogni articolo avrà un ID e un parentID(dal titolo vedo che te l'eri già immaginato) e ti basta una tabella.

    Per quanto riguarda le immagini ogni articolo immagino ne avrà associata una o più... Ma un'immagine può essere associata a più articoli?
    SI: tabella 'immagini' con idImg e percorso + tabella 'linkImgsArts' con idImmagine e idArticolo
    No: tabella 'immagini' con idImg,idArticolo e percorso immagine

    RIP Cicciobenzina 9/11/2010

    "Riseminaciceli, i ceci nell'orto"

  3. #3
    Originariamente inviato da wallrider
    ogni articolo avrà un ID e un parentID(dal titolo vedo che te l'eri già immaginato) e ti basta una tabella.

    Per quanto riguarda le immagini ogni articolo immagino ne avrà associata una o più... Ma un'immagine può essere associata a più articoli?
    SI: tabella 'immagini' con idImg e percorso + tabella 'linkImgsArts' con idImmagine e idArticolo
    No: tabella 'immagini' con idImg,idArticolo e percorso immagine

    Ciao wallrider, inanzitutto grazie per la risposta.

    Quello che non mi è chiaro:
    Se ho una sola tabella "Articoli" qual'è la logica di inserimento e strutturazione dei nodi?
    Mi spiego meglio, stò lavorando ad un sito ed ho strutturato il backend in questo modo:

    TABELLA MENU:
    IDMenu
    Titolo

    TABELLA ARTICOLO:
    IDArticolo
    Titolo
    Testo
    IDMenu

    Tabella SUBARTICOLO
    IDSubarticolo
    Titolo
    Testo
    IDArticolo

    (Per quanto riguarda le immagini, ho due tabelle una per quelle associate a tabella Artcoli, ed una per quella associate a Tabella Subarticoli)

    Nel backend ho creato le varie pagine di inserimento/modifica/cancellazione e la logica che uso è quella Master-Details (quindi una relazione tra tabelle), quindi il risultato è:

    Menu1
    >>Articolo1
    >>Articolo2
    >>>SubArticolo1
    >>>SubArticolo2
    Menu2
    >>Articolo1
    >>Articolo2
    >>>SubArticolo1
    >>>SubArticolo2
    ect..

    Ma non riesco a capire come ottenere lo stesso risultato con una sola tabella "Articolo"?
    Spero di essere stato chiaro..

    Grazie

  4. #4
    Co una tabella fai tutto.
    tblNames
    ID - contatore
    name - testo
    parentID - numerico

    Le voci di primo livello avranno parentID = 0
    ID - name - parentID
    1 - Sport - 0
    2 - Musica - 0
    3 - Calcio - 1
    4 - Serie A - 3
    5 - Champions League - 3
    6 - Tennis - 1
    7 - Rolland Garros - 6
    8 - Heavy Metal - 2
    9 - Blues - 2
    10 - BB King - 9
    11 - Iron Maiden - 8
    12 - AS Roma - 4

    Con due funzioni ad hoc costruisci il menu ed anche la navigation bar.
    codice:
    <%
    set conn = server.createObject("ADODB.Connection")
    conn.open 	"Provider=sqloledb; " &_				
    		"Network Library=DBMSSOCN; " &_				
    		"Encrypt=yes;" &_				
    		"Data Source=xxxxxxxx;" &_				
    		"Initial Catalog=yyyyyyyy;" &_				
    		"User Id=kkkkkkkk;" &_				
    		"Password=wwwwwwww;"	
    			
    page = request.serverVariables("PATH_INFO")
    
    
    
    id = request.queryString("id")
    
    if len(id) > 0 and isNumeric(id) then
    
    	id = cLng(id)
    
    else
    
    	id = 0
    
    end if
    
    
    
    
    function buildMenu(theID, theConn)
    
    	theSql = "SELECT * FROM tblNames WHERE parentID = " & theID
    
    		set theRs = theConn.execute(theSql)
    
    			if not theRs.eof then
    
    				response.write "<ul>" & vbCrLf
    
    					do until theRs.eof
    
    						response.write "[*]" & theRs("name") & "" & vbCrLf
    
    						call buildmenu(theRs("ID"), theConn)
    
    						response.write "" & vbCrLf
    
    						theRs.moveNext
    
    					loop
    
    				response.write "[/list]" & vbCrLf
    
    				theRs.Close
    
    				set theRs = nothing
    
    			else
    
    				theRs.close
    
    				set theRs = nothing
    
    			exit function
    
    		end if
    
    end function
    
    
    
    function buildNavigationBar(theID, theBaseID, theConn, byRef theNavigationBar)
    
    	theSql = "SELECT * FROM tblNames WHERE ID = " & theID	
    
    	set theRs = theConn.execute(theSql)
    
    		if not theRs.eof then
    
    				if theBaseID = theRs("ID") then
    
    					tempString = theRs("name") & " "
    
    				else
    
    					tempString = "" & theRs("name") & " "
    
    				end if
    
    			theNavigationBar = "&raquo; " & tempString & theNavigationBar
    
    			tempID = theRs("parentID")
    
    			theRs.close
    
    			set theRs = nothing
    
    			call buildNavigationBar(tempID, theBaseID, theConn, theNavigationBar)			
    
    		else
    
    			theRs.close
    
    			set theRs = nothing
    
    			exit function
    
    		end if
    
    end function
    
    %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    
    <html>
    
    <head>
    
    <title>TITOLO PAGINA</title>
    
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
    
    </head>
    
    <body>
    
    <%
    
    call buildMenu(0, conn)
    
    call buildNavigationBar(id, id, conn, navigationBar)
    
    response.write navigationBar
    
    %>
    
    </body>
    
    </html>
    
    <%
    
    conn.close
    
    set conn = nothing
    
    %>

  5. #5
    Quindi in questo modo posso creare infiniti nodi?
    e come funziona l'inserimento/modifica/cancellazione di un articolo?

    ad esempio se devo inserire un nuovo articolo sotto musica>blues come devo relazionare a livello di codice?

    grazie

  6. #6
    Utente di HTML.it L'avatar di wallrider
    Registrato dal
    Apr 2003
    Messaggi
    2,755
    pensa a quando vuoi mettere un file in una cartella(con esplora risorse)
    ti porti nella cartella richiesta (di cui esplora risorse si segnerà in qualche modo l'ID) e ci metti il file.
    Allo stesso modo te devi dare la possibilità di scegliere un livello, poi tutti i livelli che hanno come idPadre l'id del livello selezionato, e così via

    una volta scelto assegni all'articolo l'id selezionato (nel campo idPadre!!!)
    RIP Cicciobenzina 9/11/2010

    "Riseminaciceli, i ceci nell'orto"

  7. #7
    Vi ringrazio entrambi, credo di cominciare a capirne la logica.

    Un'altra domanda:
    Nel caso volessi creare un sistema di ordinamento con le tipiche freccettine (sopra-sotto) a fianco dei nodi come dovrei procedere?

    Ho aggiunto un ulteriore campo (posizione) alla tabella tblNames, quindi avendo la seguente situazione:

    ARTICOLO1
    ARTICOLO2
    ARTICOLO3

    Se voglio spostare ARTICOLO2 sopra ARTICOLO1 oppure sotto ARTICOLO3 quale sistema usare?

    Grazie ancora

  8. #8
    Ogni oggetto fa riferimento al padre diretto, ovvero ha come parentID quello del padre.
    Se vuoi che l'oggetto PIPPO sia figlio dell'oggetto PLUTO allora PIPPO dovrà avere come parentID l'ID di PLUTO.
    La sequenza gerarchica la puoi ricostruire con la funzione che costruisce la navigationBar, dove, al limite, invece di unire le stringhe con le URL alla variabile navigationBar, unisci gli ID dividendoli da virgola. Otterrai in questo modo la sequenza degli ID dal parent più remoto fino all'oggetto figlio.
    Per ordinare le voci puoi aggiungere un campo "orderBy" di tipo numerico e memorizzare il valore numerico rappresentativo della posizione di ogni oggetto nel contesto al quale appartiene, ovvero, il proprio ordine rispetto agli oggetti fratelli.
    Fai una pagina che in base all'ID passato in queryString visualizza l'elenco degli elementi figli.
    Accanto ad ogni oggetto figlio metti una combo box con i valori selezionabili da 1 a N (quanti sono gli oggetti figli). Imposti la posizione per ognuno e quindi fai submit.
    codice:
    <%
    set conn = server.createObject("ADODB.Connection")
    conn.open 	"Provider=sqloledb; " &_				
    		"Network Library=DBMSSOCN; " &_				
    		"Encrypt=yes;" &_				
    		"Data Source=xxxxxxxx;" &_				
    		"Initial Catalog=yyyyyyyy;" &_				
    		"User Id=kkkkkkkk;" &_				
    		"Password=wwwwwwww;"	
    
    id = request.queryString("id")
      if len(id) > 0 and isNumeric(id) then
        id = cLng(id)
      else
        id = 0
      end if
    
    submit = request.serverVariables("REQUEST_METHOD") = "POST"
      if submit then
        for each item in request.form
          if left(item,3) = "id_" then
            tempID = mid(item,4)
            tempValue = request.form(item)
            conn.execute("UPDATE tblNames SET orderBy = " & tempValue & " WHERE ID = " & tempID)
          end if
        next
      end if
    
    pagina = request.serverVariables("PATH_INFO")
    
    sql = "SELECT * FROM tblNames WHERE parentID = " & id & " ORDER BY orderBy"
    set rs = server.createObject("ADODB.Recordset")
    rs.open sql, conn, 3, 1
      if not rs.eof then
        cont = rs.recordCount
    %>
    <form name="orderBy" method="post" action="<%=pagina%>?id=<%=id%>">
    <%
          do until rs.eof
    %>
    <select name="id_<%=rs("ID")%>">
    <%
            for i = 1 to cont
    %>
    - <option value="<%=i%>"<% if i = rs("orderBy") then %> selected="selected"<% end if %>><%=i%></option>
    <%
            next
    %>
    </select> <%=rs("name")%>
    
    <%
            rs.moveNext
          loop
    %>
    <input type="submit" value="ESEGUI" />
    </form>
    <%
      end if 
    rs.close
    set rs = nothing
    
    conn.close
    set conn = nothing
    %>
    Ho scritto sta roba senza testarla, proprio ora. Potrebbe capitare che ci sia qualche errore... ma la logica è questa.

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.