Queer European MD passionate about IT

schema_logico.tex 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. % !TEX root = ../main.tex
  2. \\
  3. \textbf{Schema logico relazionale in formato testuale}
  4. \begin{lstlisting}[style=SQLu,escapechar=@]
  5. Persone(@\underline{IdPersona}@, Nome, Cognome, Email, CodiceFiscale)
  6. Clienti(@\underline{IdPersona*}@, IndirizzoSpedizione)
  7. Birraie(@\underline{IdPersona*}@, Soprannome)
  8. Birrifici(@\underline{IdBirrificio}@, Nome, AnnoFondazione, Motto, Stemma,
  9. CapacitàProduttiva)
  10. BirrificiBirraie(@\underline{IdBirrificio*, IdBirraia*}@)
  11. Fornitori(@\underline{IdFornitore}@, RagioneSociale, PartitaIva, Indirizzo)
  12. Fatture(@\underline{IdFattura}@, IdBirrificio*, IdFornitore*, Data,
  13. NumeroFattura, Importo)
  14. TipiIngredienti(@\underline{IdTipo}@, Tipo, UnitàDiMisura)
  15. Ingredienti(@\underline{IdIngrediente}@, IdTipo*, Descrizione)
  16. Acquisti(@\underline{IdFattura*, IdIngrediente*}@, Quantità)
  17. Ricette(@\underline{IdRicetta}@, IdBirrificio*, IdCreatrice*, IdRicettaMadre*,
  18. Nome, DataCreazione, Stato)
  19. IngredientiRicette(@\underline{IdRicetta*, IdIngrediente*}@, Quantità)
  20. Produzioni(@\underline{IdProduzione}@, IdRicetta*, DataProduzione, NumeroLotto,
  21. Stato, NumeroBottiglie)
  22. Prenotazioni(@\underline{IdCliente*, IdProduzione*}@, Stato, Quantità)
  23. Note(@\underline{IdNota}@, IdProduzione*, Testo)
  24. NoteDegustazione(@\underline{IdNota*}@, Giudizio)
  25. \end{lstlisting}
  26. \paragraph{Dipendenze funzionali}
  27. \begin{itemize}
  28. \itemsep0em
  29. \item Per ogni tabella la chiave primaria (sottolineata) determina ciascuno
  30. degli attributi della tabella.
  31. \begin{lstlisting}[style=SQLu,escapechar=@]
  32. IdPersona @$\to$@ Nome, IdPersona @$\to$@ Cognome, IdPersona @$\to$@ Email,
  33. IdPersona @$\to$@ CodiceFiscale, @$\textellipsis$@
  34. \end{lstlisting}
  35. \item Nella tabella \texttt{Persone}, \texttt{CodiceFiscale} è chiave
  36. naturale e determina tutti gli altri attributi.
  37. Ho ritenuto prudente aggiungere una chiave artificiale perché, se è vero
  38. che due persone diverse non avranno mai lo stesso codice fiscale, è vero
  39. anche che ci possono essere errori umani nell'inserimento di un CF e voglio
  40. riservarmi la possibilità di correggere un CF senza minare l'affidabiltà
  41. della base di dati.
  42. \item Stesso discorso per la \texttt{RagioneSociale} e la \texttt{PartitaIva} nella tabella
  43. \texttt{Fornitori}: ciascuno è chiave separatamente.
  44. \item Nella tabella \texttt{Fatture}, la coppia di attributi \texttt{\{IdFornitore, NumeroFattura\}}
  45. è chiave.
  46. \item Nella tabella \texttt{Produzioni}, il NumeroLotto \underline{non} è chiave, in
  47. quanto birrifici diversi possono avere lotti uguali, è solo all'interno del
  48. birrificio che il lotto identifica univocamente la produzione.
  49. \end{itemize}
  50. Uno schema R, avente insieme di attributi T e insieme di dipendenze funzionali F, \lstinline{R<T, F>}, è
  51. in forma normale di Boyce-Codd (BCNF) se ogni dipendenza funzionale della chiusura di F o è
  52. banale o ha come determinante una superchiave di T.
  53. Esiste un teorema che semplifica il calcolo, asserendo che se la condizione di cui sopra vale per
  54. una qualsiasi copertura di F allora vale per l’intera chiusura di F.
  55. Nella copertura di F che ho descritto sopra (che peraltro è canonica: ogni dipendenza ha un
  56. solo attributo come determinato, nessuna dipendenza è ridondante e non sono presenti
  57. attributi estranei, in quanto ogni determinante è chiave), ogni dipendenza funzionale ha
  58. come determinante o la chiave primaria o una chiave naturale che non è stata scelta come
  59. primaria, in ogni caso una superchiave. \underline{La BCNF è pertanto rispettata}.
  60. Alcuni vincoli intra-relazionali possono essere tradotti in trigger in modo da
  61. mantenere la coerenza del database con l'inserimento di record.
  62. Per esempio:
  63. \begin{lstlisting}[style=SQLu,escapechar=@]
  64. CREATE TRIGGER IntegritàReferenzialeNote
  65. BEFORE INSERT ON Note
  66. BEGIN
  67. SELECT
  68. CASE WHEN NEW.IdProduzione NOT IN (
  69. SELECT IdProduzione FROM Produzioni)
  70. THEN RAISE (ABORT,'Produzione non valida!')
  71. END;
  72. END;
  73. \end{lstlisting}