GESTIONE MAGAZZINO 1 Un azienda vuole automatizzare la procedura di gestione delle scorte del suo magazzino di prodotti organizzato per reparti. Il sistema informativo deve essere in grado di : produrre i listini dei prodotti; controllare i prodotti sotto scorta e, quindi, produrre l elenco dei prodotti da riordinare; calcolare il valore del magazzino per ogni reparto; calcolare la media dei costi d acquisto dei prodotti raggruppati per reparto; gestire i fornitori. Considerato il problema proposto, precisando eventuali ipotesi aggiuntive, si realizzi: un analisi della realtà di riferimento che illustri le premesse per i successivi passi della progettazione della base di dati; uno schema concettuale della base di dati; uno schema logico della base di dati; la definizione delle relazioni della base di dati in linguaggio SQL. SOLUZIONE Analisi del problema Ipotesi aggiuntive Analisi dei dati Schema concettuale Schema logico Definizione delle relazioni Esempio di Progettazione di un database a cura del Prof. Salvatore DE GIORGI Pag. 1
Analisi del problema La prima entità da considerare è quella che si riferisce ai prodotti. L entità richiesta è una anagrafe dei prodotti presenti nel magazzino dell azienda con le proprietà essenziali ed indispensabili a gestire tutte le richieste proposte dal problema. In particolare per la gestione degli ordini e il controllo dei prodotti sotto scorta si ritiene necessario l utilizzo, per ogni prodotto, dei valori relativi alla scorta minima e alla scorta massima. La scorta minima (stock) o scorta di sicurezza di un qualsiasi prodotto è la quantità minima conservata in magazzino necessaria per proteggersi contro oscillazioni della domanda dei clienti relativa al tempo di approvvigionamento. Ovvero, è la quantità che è utile avere in magazzino per far fronte ad ogni richiesta da parte dei clienti prima che si faccia un ordine di acquisto. La scorta massima, invece, è la quantità che non conviene superare in quanto, sempre relativamente alla media delle vendite, si potrebbero avere problemi, per esempio, legati alla deperibilità dei prodotti o ai costi di gestione stessi della merce. Si deve, infatti, tener presente che la quantità conservata in eccesso rispetto alle esigenze comporta dei costi in termine di spazio fisico occupato (scaffali, capannoni, ecc.) ed in termine di spese affrontate per l acquisto (pagamento ai fornitori, interessi bancari, ecc) Si deve, comunque, sottolineare che mentre la giacenza attuale è un valore ben preciso e riguarda il momento in cui si effettua un controllo delle giacenze, i valori relativi alla scorta massima e minima sono valori teorici e soggettivi (molto spesso tali valori scaturiscono da statistiche varie) che possono dipendere da diversi fattori : il tipo di clientela dell azienda, la posizione fisica dell azienda, il periodo preso in considerazione, il potere d acquisto dell azienda, ecc I tre parametri che vengono, generalmente, presi in considerazione per effettuare l ordine sono : la giacenza attuale, la scorta minima e la scorta massima. Quando si effettua un ordine si controlla, per ogni prodotto, se la quantità attuale giacente in magazzino è inferiore alla scorta minima. In tal caso la quantità da ordinare è uguale alla differenza fra la scorta massima e la quantità giacente. Per i prodotti, quindi, sotto scorta : Quantità da ordinare = Scorta massima - Giacenza Il valore complessivo del magazzino viene calcolato sommando il prodotto della giacenza attuale di ogni articolo per il relativo costo d acquisto. Ovviamente, se si vuole un valore relativo a ciascun reparto, è sufficiente raggruppare gli articoli per reparto. La successiva entità da analizzare è l anagrafe dei fornitori contenente tutti i fornitori già registrati con le proprietà essenziali. La soluzione proposta prevede che un prodotto possa essere fornito da un solo fornitore e quindi le due entità sono collegate con una relazione uno-a-molti. Se, invece, si vuole risolvere il problema prevedendo che uno stesso prodotto possa essere acquistato da più fornitori (questa soluzione è presentata nell esempio GESTIONE MAGAZZINO2 ), l associazione fra le due entità da uno-a-molti diventa molti-a-molti con evidente introduzione di un ulteriore entità che possa consentire tale relazione (l associazione molti-a-molti viene trasformata in due associazioni uno-a-molti con l aggiunta di una terza entità). Per gestire la classificazione dei prodotti per reparto ( sezione in cui è possibile suddividere un ufficio, un negozio, un ospedale, ecc. ) si deve prevedere un entità reparti contenente la descrizione di tutti i reparti (per es.,nel caso di un supermercato, : casalinghi, alimentari, detersivi, surgelati, ecc.) in cui è suddiviso fisicamente il magazzino. Esempio di Progettazione di un database a cura del Prof. Salvatore DE GIORGI Pag. 2
Ipotesi aggiuntive Entità "Reparto": la chiave primaria è artificiale ad autoincremento. Sono previste solo le proprietà strettamente necessarie per la risoluzione dei quesiti. L utilizzo dell entità Reparto permette di ottenere una descrizione univoca per ogni reparto associato a ciascun prodotto. Entità "Fornitore": la chiave primaria è artificiale ad autoincremento. Sono previste solo le proprietà strettamente necessarie per la risoluzione dei quesiti. Entità Prodotto : la chiave primaria è artificiale ad autoincremento per evitare i problemi generati dalle omonimie (prodotti con la stessa descrizione ma provenienti da produttori o fornitori diversi). Per una migliore gestione dell ordine, fra gli attributi dell entità Prodotto, oltre all attributo idprodotto corrispondente al codice che l azienda utilizza per identificare i propri prodotti, sarebbe opportuno inserire il codice del prodotto usato dal fornitore per identificare i suoi prodotti. In questo modo, nel fare un ordine, si può far riferimento ad un prodotto sia con la sua descrizione che con il codice usato dal fornitore e, quindi, evitare spiacevoli disguidi che potrebbero verificarsi per un errata trascrizione della descrizione. Esempio di Progettazione di un database a cura del Prof. Salvatore DE GIORGI Pag. 3
Analisi dei dati Le entità che possono essere individuate per risolvere il problema sono : ENTITA Reparto Fornitore Prodotto contiene l elenco dei reparti in cui è diviso il magazzino; contiene l elenco anagrafico dei fornitori; contiene l elenco dei tutti i prodotti del magazzino; Gli attributi, per ciascuna entità, individuati per risolvere il problema sono : ATTRIBUTI Tipo di entità Reparto Fornitore Prodotto Sistema informativo Gestione Magazzino idreparto, Descrizione Reparto; Attributi idfornitore, Ragione Sociale, Indirizzo, Residenza, Partita Iva, Numero di Telefono, E-Mail; idprodotto, Descrizione Prodotto, Sconto da effettuare al cliente, Costo d acquisto, Prezzo di vendita, Giacenza, Scorta Massima, Scorta Minima; Tra l entità Fornitore e l entità Prodotto esiste un associazione uno-a-molti in quanto un fornitore può fornire uno o più prodotti e ciascun prodotto deve essere fornito da un solo fornitore. Tra l entità Reparto e l entità Prodotto esiste un associazione uno-a-molti in quanto un reparto può contenere uno o più prodotti e ciascun prodotto deve essere sistemato in un solo reparto. Esempio di Progettazione di un database a cura del Prof. Salvatore DE GIORGI Pag. 4
Schema concettuale della base di dati Le relazioni tra i tipi di entità nel modello dei dati sono individuate nel seguente Modello Entità/Associazioni (E/R) : FORNITORE PRODOTTO REPARTO Nel modello E/R sono indicati i nomi delle entità, l opzionalità od obbligatorietà delle associazioni. Il modello viene verificato utilizzando le regole di lettura : ogni fornitore può fornire uno o più prodotti, ogni prodotto deve essere fornito da un solo fornitore; ogni reparto può contenere uno o più prodotti, un prodotto deve essere abbinato ad un solo reparto; Esempio di Progettazione di un database a cura del Prof. Salvatore DE GIORGI Pag. 5
Schema logico della base di dati Come tipo di schema logico, dovendo poi realizzarlo nello standard SQL, si sceglie di utilizzare quello relazionale. Applicando le regole di corrispondenza tra il modello E/R ed il modello Relazionale si passa dal precedente schema concettuale al modello logico che viene descritto sia nella forma testuale che in quella grafica. Rappresentazione testuale dello schema logico : Nella rappresentazione testuale si elencano le tabelle (indicando per ciascuna i campi) che rappresentano le entità dello schema concettuale e le tabelle che rappresentano le eventuali relazioni molti-a-molti, introducendo, inoltre, le chiave esterne per rappresentare le associazioni (le chiavi primarie sono sottolineate, le chiavi esterne sono in corsivo). Si elencano di seguito le tabelle che rappresentano le entità dello schema concettuale : tbreparti (idreparto,reparto) tbfornitori (idfornitore,ragionesociale, indirizzo, residenza, partitaiva, telefono, email) tbprodotti (idprodotto, prodotto, ksreparto, ksfornitore, costoacquisto, prezzovendita, sconto, giacenza, scortamax, scortamin) Per realizzare l associazione uno-a-molti fra l entità Reparto e l entità Prodotto si introduce, fra gli attributi dell entità a molti (Prodotto), la chiave esterna ksreparto associata alla chiave primaria idreparto dell entità a uno (Reparto). Per realizzare l associazione uno-a-molti fra l entità Fornitore e l entità Prodotto si introduce, fra gli attributi dell entità a molti (Prodotto), la chiave esterna ksfornitore associata alla chiave primaria idfornitore dell entità a uno (Fornitore). Rappresentazione grafica dello schema logico : La rappresentazione grafica dello schema logico relativo al sistema informativo per la gestione del Magazzino è il seguente : Esempio di Progettazione di un database a cura del Prof. Salvatore DE GIORGI Pag. 6
Definizione delle Tabelle Nel definire le tabelle e la struttura delle stesse, è consigliabile elencarle partendo dalle tabelle che non presentano chiavi esterne. In successione si definiscono le tabelle le cui chiavi primarie sono utilizzate da altre tabelle come chiavi esterne. Nel prospetto seguente, per es., si definiscono prima le tabelle tbfornitori e tbreparti (in tal caso l ordine è soggettivo) e poi la tabella tbprodotti, in quanto quest ultima ha, fra gli attributi, due campi definiti come chiavi esterne alle suddette tabelle. Tabella Nome campo Chiave Tipo dati Dim. Dec. Null Descrizione tbreparti idreparto Primaria Intero 4 Autoincremento reparto Carattere 30 Vincolo : valori unici tbfornitori idfornitore Primaria Intero 4 Autoincremento ragionesociale Carattere 40 Vincolo : valori unici indirizzo Carattere 30 residenza Carattere 30 partitaiva Carattere 11 Vincolo : valori unici telefono Carattere 15 SI email Carattere 30 SI tbprodotti idprodotto Primaria Intero 4 Autoincremento prodotto Carattere 30 Descrizione prodotto ksreparto Esterna Intero 4 Integrità referenziale con idreparto della tabella tbreparti ksfornitore Esterna Intero 4 Integrità referenziale con idfornitore della tabella tbfornitori costoacquisto Decimale 8 2 prezzovendita Decimale 8 2 sconto Decimale 4 2 SI giacenza Decimale 6 2 Esistenza attuale scortamax Decimale 6 2 Scorta massima scortamin Decimale 6 2 Scorta minima Esempio di Progettazione di un database a cura del Prof. Salvatore DE GIORGI Pag. 7
Definizione delle relazioni della base di dati in SQL Lo schema logico relazionale precedente (tabelle, relazione ed applicazione dei vincoli di integrità dei dati e referenziale) può essere creato con le seguenti istruzioni SQL (proposte in versione per ACCESS e MySQL. ACCESS CREATE TABLE tbreparti ( idreparto Counter PRIMARY KEY, reparto Char(30) NOT NULL UNIQUE); MySQL CREATE TABLE tbreparti( idreparto int(4) unsigned AUTO_INCREMENT PRIMARY KEY, reparto char(30) NOT NULL UNIQUE ) TYPE=MyISAM; CREATE TABLE tbfornitori ( idfornitore Counter PRIMARY KEY, ragionesociale Char(40) NOT NULL UNIQUE, indirizzo Char(30) NOT NULL, residenza Char(30) NOT NULL, partitaiva Char(11) NOT NULL UNIQUE, telefono Char(15), email Char(30)); CREATE TABLE tbfornitori ( idfornitore int(4) unsigned AUTO_INCREMENT PRIMARY KEY, ragionesociale char(40) NOT NULL UNIQUE, indirizzo char(30) NOT NULL, residenza char(30) NOT NULL, partitaiva char(11) NOT NULL UNIQUE, telefono char(15), email char(30) ) TYPE=MyISAM; CREATE TABLE tbprodotti ( idprodotto Counter PRIMARY KEY, prodotto Char(30) NOT NULL, ksreparto Long NOT NULL, ksfornitore Long NOT NULL, costoacquisto Single NOT NULL, prezzovendita Single NOT NULL, sconto Single, giacenza Single NOT NULL, scortamax Single NOT NULL, scortamin Single NOT NULL, FOREIGN KEY(ksreparto) REFERENCES tbreparti(idreparto), FOREIGN KEY(ksfornitore) REFERENCES tbfornitori(idfornitore)) ; CREATE TABLE tbprodotti ( idprodotto int(4) unsigned AUTO_INCREMENT PRIMARY KEY, prodotto char(30) NOT NULL, ksreparto int(4) NOT NULL, ksfornitore int(4) NOT NULL, costoacquisto decimal(8,2) NOT NULL, prezzovendita decimal(8,2) NOT NULL, sconto decimal(4,2), giacenza decimal(6,2) NOT NULL, scortamax decimal (6,2) NOT NULL, scortamin decimal (6,2) NOT NULL ) TYPE=MyISAM; Nota : le istruzioni proposte per MySQL sono relative all uso di tabelle tipo MyISAM che non supportano l integrità referenziale definita con FOREIGN KEY. Il tipo di tabella InnoDB, invece, supporta la FOREIGN KEY similmente ad ACCESS. Esempio di Progettazione di un database a cura del Prof. Salvatore DE GIORGI Pag. 8