Newsgroup: it.comp.software.database
Titolo: [SQL] Normalizzazione DB e problemi

Ho provato a normalizzare il mio DB che mentre prima prevedeva (lo
sintetizzo ovviamente) una tabella [interpreti] con i campi :
ID, NOME, INGLESE, ITALIANO, SPAGNOLO, etc, con i campi lingua bouleani ,
ora č impostato con tre tabelle :
Interpreti                 (ID, NOME)
Lingue                     (ID, LINGUA)
Interpreti_Lingue     (IDinterprete, IDlingua)
E mi sembra da una parte che il DB č piů snello, e dall'altra che mi devo
fare un mazzo pazzesco per tirare fuori i dati.
Esempio voglio stampare i nomi degli interpreti e le lingue parlate su una
pagina ASP ecco che:
mentre prima eseguivo una sola query ed un solo loop sulla medesima tiravo
fuori un recordset completo di tutti i dati che volevo,
ora invece devo fare un loop per ogni interprete e dentro questo loop un
altro loop per ogni lingua parlata.
Il risultato č che per dieci interpreti devo fare 11 connessioni al DB,
mentre prima con una sola risolvevo il probelma.
Dove sbaglio, e come risolvo?
Grazie dell'ascolto,
Simone

 altro loop per ogni lingua parlata.
ma... non capisco il discorso "loop", mi viene quasi in mente che tu non
utilizzi i JOIN..... č cosě ?

 utilizzi i JOIN..... č cosě ?
Li utilizzo, ma non riesco a risolvere con i join, in quanto ottengo piů
record per ogni interprete in cui cambia solamente un campo che č quello
della lingua, a me invece servirebbe che in un record solo ci fosse:
nome , lingua1, lingua2, lingua3 , etc.
pippo, inglese, spagnolo
paperino, francese, tedesco, inglese
etc.
non so se č possibile, ma lo spero altrimenti non mi conviene normalizzare.
Grazie,
Simone

 nome , lingua1, lingua2, lingua3 , etc.
Puoi usare un meccanismo tipo OLAP per ottenre qualche cosa del genere,
per ASP c'era una articolo su 
www.aspitalia.com
 sull'argomento.
NOTA: normalizzare va' bene per avere il database con una struttura
"standard" e facilmente "estensibile", ma DEnormalizzare e' la regola
quando si tratta di migliorare le prestazioni.
Traduzione: se ti ritrovi piu' comodo con 'n' campi in un record fai
pure.
Davide

 etc.
io utilizzerei delle stored procedure...
ciao

> io utilizzerei delle stored procedure...
Purtroppo uso access :(
Simone

 pure.
Lo so, e lo capisco bene, perň vorrei impostarmi il lavoro in un'ottica di
sviluppo futuro piuttosto agevole, e normalizzare il DB mi sembrava un
inizio promettente.
Poi calcolando l'aggiunta futura delle province mi sembra inevitabile
impostarlo cosě.
Grazie,
Simone

 Non ho trovato nulla su aspitalia con la chiave OLAP
Mi pareva fosse "Data Shaping" o qualche cosa del genere... era
di Insalata...
Davide

Sei un genio, era proprio quello che cercavo.
http://www.aspitalia.com/articoli/db/datashaping.asp
Grazie mille e a buon rendere!
Simone


 Purtroppo uso access :(
oiiiii.....
forse è una fortuna allora !
prova a guardare il metodo PIVOT e/o TRANSFORM, trasforma le righe in
colonne...
se hai difficoltà dimmelo...
ciao

 se hai difficoltà dimmelo...
Sinceramente ho un po' di difficoltà, ma non tanto a capire, quanto a
reperire del materiale.
Odio la nuova guida di Access 2000, quella del 97 era molto più semplice ed
intuitiva.
Mi puoi dare qualche link in cui posso reperire il materiale?
Grazie,
Simone

 Mi puoi dare qualche link in cui posso reperire il materiale?
non ho link ad Access2000, non lo utilizzo più.
dalla guida di Access97:
Nel seguente esempio si utilizza la proposizione TRANSFORM di SQL per creare
una query a campi incrociati che visualizza il numero di ordini ricevuti da
ciascun impiegato per ogni trimestre del 1994. Per eseguire questa routine è
richiesta la funzione OutputTRANSFORMSQL.
Sub TransformX1()
 Dim dbs As Database
 Dim strSQL As String
 Dim qdfTRANSFORM As QueryDef
 strSQL = "PARAMETERS prmAnno SHORT; TRANSFORM " _
  & "Count(IDOrdine) " _
  & "SELECT Nome & "" "" & Cognome AS " _
  & "NomeCompleto FROM Impiegati " _
  & "INNER JOIN Ordini " _
  & "ON Impiegati.IDImpiegato = " _
  & "Ordini.IDImpiegato WHERE DatePart " _
  & "(""yyyy"", DataOrdine) = [prmAnno] "
    strSQL = strSQL & "GROUP BY Nome & " _
& """ "" & Cognome " _
  & "ORDER BY Nome & "" "" & Cognome " _
  & "PIVOT DatePart(""q"", DataOrdine)"
 ' Modifica questa riga per includere il percorso
 ' di Northwind sul computer.
 Set dbs = OpenDatabase("Northwind.mdb")
 Set qdfTRANSFORM = dbs.CreateQueryDef _
  ("", strSQL)
 OutputTRANSFORMSQL qdfTRANSFORM, 1994
 dbs.Close
End Sub
Nel seguente esempio si utilizza la proposizione TRANSFORM di SQL per creare
una query a campi incrociati leggermente più complessa della precedente che
mostra il totale in dollari degli ordini ricevuti da ciascun impiegato per
ogni trimestre del 1994. Per eseguire questa routine, viene richiesta la
funzione OutputTRANSFORMSQL.
Sub TransformX2()
 Dim dbs As Database
 Dim strSQL As String
 Dim qdfTRANSFORM As QueryDef
 strSQL = "PARAMETERS prmAnno SHORT; TRANSFORM " _
  & "Sum(Subtotale) SELECT Nome & "" """ _
  & "& Cognome AS NomeCompleto " _
  & "FROM Impiegati INNER JOIN " _
  & "(Ordini INNER JOIN [Subtotali Ordini] " _
  & "ON Ordini.IDOrdine = " _
  & "[Subtotali Ordine].IDOrdine) " _
  & "ON Impiegati.IDImpiegati = " _
  & "Ordini.IDImpiegato WHERE DatePart" _
& "(""yyyy"", DataOrdine) = [prmAnno] "
    strSQL = strSQL & "GROUP BY Nome & "" """ _
  & "& Cognome " _
  & "ORDER BY Nome & "" "" & Cognome " _
  & "PIVOT DatePart(""q"",DataOrdine)"
 ' Modifica questa riga per includere il percorso
 ' di Northwind sul computer.
 Set dbs = OpenDatabase("Northwind.mdb")
 Set qdfTRANSFORM = dbs.CreateQueryDef _
  ("", strSQL)
 OutputTRANSFORMSQL qdfTRANSFORM, 1994
 dbs.Close
End Sub
Function OutputTRANSFORMSQL(qdfTemp As QueryDef, _
 intAnno As Integer)
 Dim rstTRANSFORM As Recordset
 Dim fldCiclo As Field
 Dim booPrimo As Boolean
 qdfTemp.PARAMETERS!prmAnno = intAnno
 Set rstTRANSFORM = qdfTemp.OpenRecordset()
 Debug.Print qdfTemp.SQL
 Debug.Print
 Debug.Print , , "Trimestre"
 With rstTRANSFORM
  booPrimo = True
  For Each fldCiclo In .Fields
   If booPrimo = True Then
    Debug.Print fldCiclo.Name
    Debug.Print , ;
booPrimo = False
   Else
    Debug.Print , fldCiclo.Name;
   End If
  Next fldCiclo
  Debug.Print
  Do While Not .EOF
   booPrimo = True
   For Each fldCiclo In .Fields
    If booPrimo = True Then
     Debug.Print fldCiclo
     Debug.Print , ;
     booPrimo = False
    Else
     Debug.Print , fldCiclo;
    End If
   Next fldCiclo
   Debug.Print
   .MoveNext
  Loop
 End With
End Function
ciao