Ripetitività sistematica

di il
3 risposte

Ripetitività sistematica

Premetto che questa discussione poteva essere postata nella sezione "Progettazione database", ma forse contiene elementi strettamente legati ad Access. Nell'indecisione ho postato qui.
Da molti anni ho un database ArchivioCultura che abbraccia vari materiali culturali (musica, cinema, teatro, libri...). In un punto cruciale della mia struttura tabelle ho il seguente scenario:

Supporti
IDSupporto
Supporto
TipoSupporto

DettagliSupporti
IDDS
Indice
Segnalibro
IDTitolo
Grandezza
Consigliato
Note
IDSupporto

Titoli
IDTitolo
IDAutore1
IDDa
Articolo
Titolo
Discriminante
Forma
per
n
Tonalità
L Op
N Op
n int Op
Incipit
CatTitolo
Caratteristica
Genere
IDAreaGeo
Epoca
Importanza
Note

Relazioni
Supporti.IDSupporto uno-a-molti DettagliSupporti.IDSupporto
Titoli.IDTitolo uno-a-molti DettagliSupporti.IDTitolo

Questa struttura va bene là dove c'è ripetitività sistematica su DettagliSupporti.IDTitolo nei casi di Supporti aventi TipoSupporto uguale a:
CD, LP, MC, 45, Video musica, Video teatro, Libretti lirica, Libri favole, Libri giochi, Libri arte...

Devo dire la verità, ho molti casi in cui non vi è ripetitività sistematica su tale campo e trovo alquanto fastidioso ogni volta digitare un Titolo Nuovo, innescare l'evento NotInList, digitare solo 3-4 campi di quella lunga lista, quindi Requery. Ciò accade per Libri di tutti gli altri generi, Scatole contenenti riviste, Video cinema...

Per questi casi preferisco la struttura:

Supporti
IDSupporto
Supporto
TipoSupporto

DettagliSupporti
IDDS
Indice
Segnalibro
Articolo
Titolo
QualificaTitolo
Argomenti
Genere
IDSupporto

RuoliDettagli
IDRD
IDArtista
Ruolo
IDDS

Relazioni:
Supporti.IDSupporto uno-a-molti DettagliSupporti.IDSupporto
DettagliSupporti.IDDS uno-a-molti RuoliDettagli.IDDS

Alcuni anni fa decisi di separare tutto ciò che riguardava le Ricette di cucina su un altro database, considerando che non mi interessavano le informazioni relative a Autori, Interpreti e i campi utili di Titoli erano appena 5 completamente diversi dagli altri contesti.

Non so come risolvere/snellire questa situazione se:
A) Creare un nuovo database con la nuova struttura tabelle.
B) Nello stesso database creare 2 "biforcazioni".
C) Lasciare la struttura attuale, implementare una tabella appoggio (o query?) con i campi semplificati, quindi una serie di accodamenti a catena.
D) Altro...che non riesco a cogliere.

3 Risposte

  • Re: Ripetitività sistematica

    Ho risolto seguendo la via C).
  • Re: Ripetitività sistematica

    Non ho capito che cosa e' questa ""ripetivita' sistematica"".

    Mi sembra che il problema sia questo:

    nella stessa tabella tu inserisci record ""di tipo diverso"" per i quali alcuni campi non servono.
    Quindi sei ""costretto"" a ""valorizzarli"" in qualche modo.

    SE il problema e' questo, le soluzioni ""standard"" sono due e sono le stesse che hai immaginato:

    1) mantenere la tabellona
    2) suddivisione della tabellona in 2 o piu' tabelle nel seguente modo
    
    tabella_principale (c1,c2,... tipo_record)
    
    tabella_appoggio_1 (c11,c12,...)
    tabella_appoggio_2 (c21,c22,...)
    
    ('ci', 'cij' sono le 'colonne')
    la colonna "tipo_record" ti serve per decidere QUALE tabella_appoggio usare. Potenzialmente ne potresti avere 2 o piu'.

    Ovviamente la scelta della soluzione dipende da ""quanto spazio sprechi/quanta complessita' viene introdotta"".
    Non esiste ""la risposta definitiva""

    Se vuoi, questo modo di procedere e' equivalente, nella programmazione ad oggetti, ad avere una classe base, delle classi derivate e quando si istanzia un oggetto di una certa classe, l'oggetto viene inizializzato dal ""costruttore"" della classe base (tabella_principale) PIU' dal costruttore della classe selezionata (tabella_appoggio).

    Questi sono ""concetti base"" di modellazione di database relazionali che conosci (""come il palmo della tua mano"" )

    Quindi mi sa che non e' questo.
  • Re: Ripetitività sistematica

    Ho dimenticato di dire che ho anche una tabella Interpretazioni con i campi
    IDInterpretazione (PK)
    IDInterprete (FK)(prende valori da Artisti.IDArtista)
    Ruolo
    IDDS (FK)

    quindi relazione DettagliSupporti.IDDS uno-a-molti Interpretazioni.IDDS

    Va considerato, faccio un esempio tipico che mi capita spesso, ho un Supporto (scatola) che raccoglie i vari numeri di una Rivista. All'interno di ogni rivista ci sono i singoli Testi/Articoli dei giornalisti. In questo caso un Titolo-Testo non lo troverò mai nella tabella Titoli (così come non si ripeterà mai in futuro). Inoltre l'Artista/Giornalista è sia Autore, sia Interprete e certamente unico.

    Ho creato una tabella appoggio DSX che include sia campi di Titoli, sia di DettagliSupporti, ossia:
    IDDSX (PK)
    Indice
    Segnalibro
    IDAutore1
    Articolo
    Titolo
    CatTitolo
    Genere
    IDAreaGeo
    Epoca
    Grandezza

    Dopo averla compilata, clicco su un pulsante AggiornaTutto che:
    1. Accoda i campi relativi a Titoli in Titoli (query DSXinT).
    2. Una query UT mi filtra gli ultimi nuovi record di Titoli, quindi mi accoda in Autorità i campi IDTitolo, IDAutore (query UTinAutorità).
    3. A questo punto devo aggiornare DettagliSupporti. Siccome il numero record di DSX e UT è uguale, posso ciclarli insieme e impostare in DettagliSupporti.
    4. Una query UDS mi filtra gli ultimi nuovi record di DettagliSupporti, quindi accoda in Interpretazioni (query UDSinInterpretazioni).
    5. Al termine elimino tutti i record da DSX.

    Allego il codice del pulsante AggiornaTutto
    Private Sub AggiornaTutto_Click()
    DoCmd.Close acForm, "DSX"
    Dim DB As DAO.Database
    Dim rsDSX As DAO.Recordset, rsUT As DAO.Recordset, rsUDS As DAO.Recordset, rsDS As DAO.Recordset
    'Accodamento da DSX in Titoli
    DoCmd.OpenQuery "DSXinT"
    'Accodamento da UT (UltimiTitoli) in Autorità
    DoCmd.OpenQuery "UTinAutorità"
    Set DB = CurrentDb
    'Trasferimento dati in DettagliSupporti sfruttando DSX e UT
    Set rsDSX = DB.OpenRecordset("DSX", dbOpenDynaset)
    Set rsUT = DB.OpenRecordset("UT", dbOpenDynaset)
    Set rsDS = DB.OpenRecordset("DettagliSupporti", dbOpenDynaset)
    rsDSX.MoveFirst
    rsUT.MoveFirst
    Do Until rsDSX.EOF And rsUT.EOF
        rsDS.AddNew
        rsDS!Indice = rsDSX!Indice
        rsDS!Segnalibro = rsDSX!Segnalibro
        rsDS!IDTitolo = rsUT!IDTitolo
        rsDS!Grandezza = rsDSX!Grandezza
        rsDS!IDSupporto = Forms!Supporti!IDSupporto
        rsDS.Update
        rsDSX.MoveNext
        rsUT.MoveNext
    Loop
    rsDS.Close
    rsUT.Close
    rsDSX.Close
    DB.Close
    'Accodamento da UDS (UltimiDettagliSupporti) in Interpretazioni
    DoCmd.OpenQuery "UDSinInterpretazioni"
    'Eliminazione dati da DSX
    DoCmd.RunSQL "DELETE * FROM DSX;"
    Forms!Supporti!DettagliSupporti.Requery
    End Sub
    Forse Forms!Supporti!DettagliSupporti.Requery è superflua?
Devi accedere o registrarti per scrivere nel forum
3 risposte