Dubbio su progettazione database sql server+vb.net

sabato 05 dicembre 2009 - 16.09

rob88 Profilo | Junior Member

Salve a tutti...
Nel mio software gestionale la giacenza di magazzino viene calcolata real-time...quindi in una query facendo somma carichi-somma scarichi...il problema è ke all'aumentare degli articoli il tempo di esecuzione della query inizia ad aumentare...in pratica ho una vista nella quale faccio tutto ovvero ho la tabella articoli relazionata con altre tabelle e in qst stessa vista faccio il calcolo della giacenza...
volevo sapere se mi conveniva andare a mettere un campo "Giacenza" nella tabella articoli...ke di volta in volta viene aggiornato...scelta ke dal punto di vista del modello relazionale mi da dei dubbi in quanto è un campo calcolato....
Grazie

Teech Profilo | Expert

Personalmente utilizzerei una vista dove, oltre ai dati degli articoli metterei delle colonne contenenti i dati calcolati di esistenza. Le selezioni le effettuerei sulla vista mentre le scritture derivanti dall'applicativo (aggiornamenti, cancellazioni e inserimenti) li effettuerei direttamente sulle tabelle attraverso delle Stored Procedure.
Secondo me, in questo modo, potresti risolvere almeno parzialmente i problemi prestazionali.

A livello prettamente logico le tabelle rimangono dei repository di dati puri, la vista ti permette di visualizzare i dati come meglio credi e la logica di aggiornamento può essere gestita in modo molto elastico.
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

rob88 Profilo | Junior Member

Grazie x la risposta...è esattamente cosi ke ho strutturato il datatabase...più tabelle relazionate....e poi una vista nella quale vado ad effettuare i calcoli....nn capisco il rallentamento anke xkè il database è normalizzato e studiato....il problema si verifica all'aumentare dei dati....forse dovrei creare viste anke x il calcolo della giacenza e inserirle nella vista principale......

Teech Profilo | Expert

Scusa ma avevo letto molto velocemente il post...
Di che quantità di dati si tratta? Ritengo che problemi prestazionali in situazioni simili si possano verificare solo su grosse quantità di dati (ma posso certamente sbagliarmi). Il Server è "carrozzato"?

In ogni caso, in questa situazione, puoi pensare di creare una tabella di giacenze (o più generalmente progressivi di magazzino) che viene popolata attraverso dei trigger. Questa tabella di progressivi la colleghi nella tua vista ed il gioco è fatto. Questo sistema logico viene già utilizzato nel 99% dei gestionali soprattutto per l'elasticità nella gestione di diversi magazzini.
In questo modo dovresti distribuire il carico dei calcoli su ogni singolo inserimento di movimentazione (che dovrebbe essere pressochè irrisorio), ma devi prestare più attenzione alla consistenza dei dati, che se gestita transazionalmente sull'applicativo dovrebbe essere piuttosto sicura.

Un'altra strada potrebbe essere quella di utilizzare una InLine Table Valued Function al posto della vista, ma non ricordo bene come funzionano per l'indicizzazione.
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

rob88 Profilo | Junior Member

Ti ringrazio x la risposta...x il momento penso di optare x la soluzione di aggiungere un campo denominato giacenza nella tabella Articoli ke viene aggiornato ad ogni operazione di movimentazione(carico/scarico ecc)...anke se la soluzione più pulita è kuella ke mi hai proposto..

Teech Profilo | Expert

In questo caso ti consiglio di mantenere comunque separate le colonne di carico e scarico (tanto il calcolo della giacenza è una sciocchezza in questo scenario) e di indicare le colonne calcolate come PERSISTED: in questo modo quando farai una Select sulla tabella il dato no dovrà essere ricalcolato di volta in volta (rischiando di trovarti nella situazione di partenza).

P.S.: Quelli che scrivo non sono certamente dei postulati, ma solo dei consigli dettati dalla mia esperienza: se vengono smentiti sono solo contento perchè andrei ad arricchire il mio bagaglio
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

rob88 Profilo | Junior Member

Questo si....anzi io ho una sola colonna kiamata quantita mentre il tipo di movimentazione è definito da una tabella relazionata a quella dei movimenti....cmq ho risolto creando dei trigger sulla tabella movimenti ke vanno ad aggiornare il campo giacenza...funziona bene....
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5