Inserimento di valori non ricorrente

di il
12 risposte

Inserimento di valori non ricorrente

Buongiorno,
Avrei la necessità di un consiglio…
Sviluppando il mio DB mi sono accorto che alla tabella che posso definire "principale" (paragonabile alla tabella ordini nella struttura DB di NorthWind) occorre aggiungere dei valori ma non in maniera sistematica. In alcuni casi occorre inserirli ma molte volte no.
Potrei aggiungere dei campi alla tabella principale e riempirli quando occorre ma così facendo occuperei spazio inutile in memoria quando non ci si presenta la necessità di inserire valori.
Come si opera in questi casi?
Spero di essermi spiegato bene.
Grazie.

12 Risposte

  • Re: Inserimento di valori non ricorrente

    Per nulla
  • Re: Inserimento di valori non ricorrente

    Non ricordo tutti i campi di Ordini. Potresti elencarli tu? A quali campi (nomi propri) ti riferisci?
  • Re: Inserimento di valori non ricorrente

    Salve a tutti,
    tendenzialmente la valorizzazione di attributi con NULL o "blank" o simili non tende ad "occupare spazio" in maniera allarmante, almeno per quanto riguarda SQL Server, quindi la premessa a mio parere non e' completamente corretta...
    andrebbe invece validata l'implementazione architetturale della base dati in relazione al motivo secondo il quale "tali attributi NON saranno valorizzati"...
    si puo' procedere con uno schema "base", quindi una tabella, che sia in relazione con altre tabelle che esplodano gli attributi piu' o meno arbitrari di tali valorizzazioni frammentarie, ma questo comporta che al momento della proiezione si renda comunque necessario mettere in join TUTTE le "sotto tabelle" di esplosione di tali attributi, e questa operazione ha un costo computazionale...
    personalmente non amo molto le soluzioni molto approccianti allo schema E(ntity) A(ttribute) V(alue) che l'estremizzazione del precedente concetto puo' portare a raggiungere, pero' ovviamente va valutata la realta' da modellare in base alle esigenze di business...
    saluti omnia
    --
    Andrea
  • Re: Inserimento di valori non ricorrente

    Faccio l'esempio pratico del mio caso specifico. Il DB che sto sviluppando prevede l'inserimento di dati d'analisi di determinati campioni.
    Alcune volte il cliente commissiona l'analisi dei campioni fornendo dati del tipo: data di campionamento, nome dell'operatore, luogo del campionamento, ecc. Tutti dati associabili ad ogni singolo campione.
    Molte volte però il campione viene semplicemente fornito dal cliente senza i dati di campionamento (la maggior parte delle volte).
    Ogni campione viene identificato da un [numero campione].
    Supponendo di prevedere l'esistenza dei campi: data di campionamento, luogo di campionamento, data di campionamento, ecc. nella stessa tabella che contiene il [numero campione], mi troverei dei casi in cui i record contengono valori definiti dei suddetti campi e casi in cui i record non contengono valori, me c'è comunque occupazione di spazio in memoria.
    Esiste un modo per strutturare il DB evitando di occupare inutilmente spazio in memoria?
    Grazie.
  • Re: Inserimento di valori non ricorrente

    Salve a tutti,
    ripeto, visto che stai parlando di un database simile a "Northwind", che e' un vecchio database di esempio fornito con SQL Server, ti consiglio di NON ragionare in termini di "memoria" o di occupazione, perche', ripeto, tendenzialmente la valorizzazione di attributi con NULL o "blank" o simili non tende ad "occupare spazio" in maniera allarmante, almeno per quanto riguarda SQL Server...
    lo storage engine di SQL Server e' sicuramente piu' intelligente di me relativamente all'occupazione fisica, le pagine di dati, siano esse relative all'indice clustered che contiene effettivamente tutti i dati come anche le pagine degli indici, vengono allocata in maniera molto fine ed intelligente, con metodologie studiate appositamente per ottenere i migliori risultati di I/O e non e' sicuramente la tua colonna con valorizzazione NULL o "blank" a creargli dei problemi... se proprio vuoi, sempre in SQL Server, ti conviene eventualmente ragionare in termini di fill factor delle pagine, per far si che ognuna di esse sia "riempita" al massimo, anche se questo puo' avere indubbie penalizzazioni nei casi di inserimento di nuove righe che comportino degli split di pagine...

    Ragiona invece nei normali termini di normalizzazione formale...
    e' inutile a mio parere ragionare in termini di "memoria" o similari in quanto il tuo "eventuale" risparmio di allocazione su disco, sempre che tale risparmio sia reale, verra' sostituito in un maggior peso computazionale in termini di risorse sia di I/O che comunque di memoria al momento della proiezione dei dati tramite le query che dovrai effettuare, perche' dovranno essere eseguiti dei join tra tutte le tabelle coinvolte nella proiezione, e quindi non necessariamente avrai dei benefici in questo senso...
    anche se tedioso, voglio ripetermi... ragiona nei normali termini di normalizzazione formale e non di allocazione o di memoria...

    tieni anche presente che, a volte e con molto "granu salis", viene effettuata anche una denormalizzazione al fine (inverso) di accelerare la proiezione di tabelle "mostruose" (quindi con carichi di allocazione pesanti) proprio per accelerare le operazioni di proiezione che potrebbero comportare un carico computazionale ritenuto eccessivo dal business per le basse performance restituite e per gli eccessivi appesantimenti derivanti dalle operazioni di join, operazioni che potrebbero eventualmente penalizzare troppo la macchina gia' (troppo?) sotto carico dall'attivita' ordinaria... ovviamente queste sono soluzioni da valutare con le pinze...
    salutoni omnia
    --
    Andrea
  • Re: Inserimento di valori non ricorrente

    Buongiorno,
    Credo di aver capito, sto mettendo in pratica.
    Grazie.
  • Re: Inserimento di valori non ricorrente

    Mi sa che state facendo un po' di ""casino"" tra un normale dbms relazionale ed uno a "schema libero" come quello usato dai dmbs NoSQL.

    Ci sono due tipi di campi:

    1) quelli a lunghezza FISSA (intero, float, decimal, ...)
    2) quelli a lunghezza VARIABLE (varchar, ...)

    si puo' partire dalla considerazione che OGNI RECORD nella tabella abbia diverse informazioni di servizio (il recod e' stato cancellato, ...), tra le quali c'e' (PROBABILMENTE sempre) una seie di flag che dicono se un certo campo del record e' NULL o no.
    La possibilita' di PERMETTERE, in una tabella, che un campo possa esser NULL o meno e' fatta a livello di definizione della colonna. Questo non va ad incidere sulla presenza o meno dei flag (dal punto di vista implementativo sono pochi byte per record).

    QUINDI, quando si assegna NULL ad un campo di un record, NON SI ALLOCA spazio, ma SEMPLICEMENTE si setta un flag (il cui spazio e' UN BIT e comunque e' gia' allocato)

    SE la colonna e' a lunghezza fissa, COMUNQUE LO SPAZIO per il corrispondete valore del campo E' STATO ALLOCATO
    SE la colonna e' a lunghezza variabile, molto probabilmente viene allocato l'equivalente dello spazio necessario per memorizzare il valore di MINIMA lungezza.

    Tutto questo per dire che NON HA ASSOLUTAMENTE NESSUN SENSO fare strane elucubrazioni relative allo spazio allocato o meno dal DBMS: e' RESPONSABILITA' del DBMS decidere che cosa fare e l'utente DEVE SOLO fornire abbastanza RAM E SPAZIO DISCO per far si che il DBMS funzioni al meglio.

    Il compito dell'utente E' UN'ALTRO: E' QUELLO di creare un MODELLO DECENTE dei dati, che segua tutte le buone regole di progettazioni, tra le quali ci sono le varie FORME NORMALI, creare i giusti INDICI e definire le query in modo CORRETTO.

    Le elucubrazioni sullo spazio se le potranno fare (e probailmente le fanno) quelli che devono gestire database da TERA/PETABYTE di dati (piu' PETA che TERA )
  • Re: Inserimento di valori non ricorrente

    Salve @migliorabile,
    io ce l'ho ben chiaro che questo NON e' un lavoro da fare per "risparmiare" bit di spazio ... non ha alcun senso in circostanze "normali"...
    ho ripetuto svariate volte di "..ragiona invece nei normali termini di normalizzazione formale..."
    buon week end omnia
    --
    Andrea
  • Re: Inserimento di valori non ricorrente

    Ma chi sarebbe omnia ?
  • Re: Inserimento di valori non ricorrente

    Tutti
    --
    Andrea
  • Re: Inserimento di valori non ricorrente

    Allora omnibus (dativo plurale).
  • Re: Inserimento di valori non ricorrente

    Grazie

    --
    Andrea
Devi accedere o registrarti per scrivere nel forum
12 risposte