|
@@ -1,21 +1,58 @@
|
|
|
% !TEX root = ../main.tex
|
|
|
-
|
|
|
+\\
|
|
|
\textbf{Schema logico relazionale in formato testuale}
|
|
|
+
|
|
|
\begin{lstlisting}[style=SQLu,escapechar=@]
|
|
|
-Tabella(@\underline{ChiavePrimaria}@, B, C, D)
|
|
|
-AltraTabella(@\underline{ChiavePrimariaEdEsterna*}@, E)
|
|
|
-@\textellipsis@
|
|
|
+Persone(@\underline{IdPersona}@, Nome, Cognome, Email, CodiceFiscale)
|
|
|
+Clienti(@\underline{IdPersona*}@, IndirizzoSpedizione)
|
|
|
+Birraie(@\underline{IdPersona*}@, Soprannome)
|
|
|
+Birrifici(@\underline{IdBirrificio}@, Nome, AnnoFondazione, Motto, Stemma,
|
|
|
+ CapacitàProduttiva)
|
|
|
+BirrificiBirraie(@\underline{IdBirrificio*, IdBirraia*}@)
|
|
|
+Fornitori(@\underline{IdFornitore}@, RagioneSociale, PartitaIva, Indirizzo)
|
|
|
+Fatture(@\underline{IdFattura}@, IdBirrificio*, IdFornitore*, Data,
|
|
|
+ NumeroFattura, Importo)
|
|
|
+TipiIngredienti(@\underline{IdTipo}@, Tipo, UnitàDiMisura)
|
|
|
+Ingredienti(@\underline{IdIngrediente}@, IdTipo*, Descrizione)
|
|
|
+Acquisti(@\underline{IdFattura*, IdIngrediente*}@, Quantità)
|
|
|
+Ricette(@\underline{IdRicetta}@, IdBirrificio*, IdCreatrice*, IdRicettaMadre*,
|
|
|
+ Nome, DataCreazione, Stato)
|
|
|
+IngredientiRicette(@\underline{IdRicetta*, IdIngrediente*}@, Quantità)
|
|
|
+Produzioni(@\underline{IdProduzione}@, IdRicetta*, DataProduzione, NumeroLotto,
|
|
|
+ Stato, NumeroBottiglie)
|
|
|
+Prenotazioni(@\underline{IdCliente*, IdProduzione*}@, Stato, Quantità)
|
|
|
+Note(@\underline{IdNota}@, IdProduzione*, Testo)
|
|
|
+NoteDegustazione(@\underline{IdNota*}@, Giudizio)
|
|
|
\end{lstlisting}
|
|
|
|
|
|
\paragraph{Dipendenze funzionali}
|
|
|
\begin{itemize}
|
|
|
-\item Per ogni tabella la chiave primaria (sottolineata) determina ciascuno degli attributi della tabella
|
|
|
-\item Altre eventuali dipendenze
|
|
|
+ \itemsep0em
|
|
|
+ \item Per ogni tabella la chiave primaria (sottolineata) determina ciascuno
|
|
|
+ degli attributi della tabella.
|
|
|
+ \begin{lstlisting}[style=SQLu,escapechar=@]
|
|
|
+ IdPersona @$\to$@ Nome, IdPersona @$\to$@ Cognome, IdPersona @$\to$@ Email,
|
|
|
+ IdPersona @$\to$@ CodiceFiscale, @$\textellipsis$@
|
|
|
+ \end{lstlisting}
|
|
|
+ \item Nella tabella \texttt{Persone}, \texttt{CodiceFiscale} è chiave
|
|
|
+ naturale e determina tutti gli altri attributi.
|
|
|
+ Ho ritenuto prudente aggiungere una chiave artificiale perché, se è vero
|
|
|
+ che due persone diverse non avranno mai lo stesso codice fiscale, è vero
|
|
|
+ anche che ci possono essere errori umani nell'inserimento di un CF e voglio
|
|
|
+ riservarmi la possibilità di correggere un CF senza minare l'affidabiltà
|
|
|
+ della base di dati.
|
|
|
+ \item Stesso discorso per la RagioneSociale e la PartitaIva nella tabella
|
|
|
+ \texttt{Fornitori}.
|
|
|
\end{itemize}
|
|
|
|
|
|
-
|
|
|
Uno schema R, avente insieme di attributi T e insieme di dipendenze funzionali F, (\lstinline{R<T, F>}) è
|
|
|
in forma normale di Boyce-Codd (BCNF) se ogni dipendenza funzionale della chiusura di F o è
|
|
|
banale o ha come determinante una superchiave di T.
|
|
|
Esiste un teorema che semplifica il calcolo, asserendo che se la condizione di cui sopra vale per
|
|
|
una qualsiasi copertura di F allora vale per l’intera chiusura di F.
|
|
|
+
|
|
|
+Nella copertura di F che ho descritto sopra (che peraltro è canonica: ogni dipendenza ha un
|
|
|
+solo attributo come determinato, nessuna dipendenza è ridondante e non sono presenti
|
|
|
+attributi estranei, in quanto ogni determinante è chiave), ogni dipendenza funzionale ha
|
|
|
+come determinante o la chiave primaria o una chiave naturale che non è stata scelta come
|
|
|
+primaria, in ogni caso una superchiave. \underline{La BCNF è pertanto rispettata}.
|