Implementazione
L'associazione tra i numeri interi positivi e le stringhe che descrivono il valore dell'attributo è demandata all'applicazione. Questo permette una notevole flessibilità: qualora, in futuro, il committente decidesse di introdurre altre categorie supplementari di lavoro, non sarebbe necessario modificare lo schema della base di dati. Inoltre la rappresentazione è più compatta e le espressioni SQL di manipolazione risultano più semplici.CREATE TABLE Lavoro
(
[...]
Tipo INTEGER NOT NULL CHECK (Tipo > 0),
[...]
)
CREATE TABLE Cliente
(
PartitaIVA VARCHAR (16) PRIMARY KEY,
RagioneSociale VARCHAR (50) NOT NULL,
Via VARCHAR (50),
CAP CHAR (5),
Comune VARCHAR (30),
Provincia CHAR (2),
Stato VARCHAR (14),
Telefono VARCHAR (14),
Fax VARCHAR (14),
EMail VARCHAR (40),
Note TEXT
);
CREATE TABLE Operatore
(
Codice VARCHAR (15) PRIMARY KEY,
Nome VARCHAR (20) NOT NULL,
Cognome VARCHAR (20) NOT NULL,
CostoOrario DECIMAL (9, 2) NOT NULL,
Attivo BOOLEAN NOT NULL,
Note TEXT
);
CREATE TABLE SchemaElettrico
(
Codice VARCHAR (30) PRIMARY KEY,
NomeFile VARCHAR (30),
Progettista VARCHAR (30),
Note TEXT
);
CREATE TABLE TipoDiArticolo
(
Codice SERIAL PRIMARY KEY,
Nome VARCHAR (50) NOT NULL,
Descrizione TEXT,
TensioneAlimentazione VARCHAR (15),
SchemaElettrico VARCHAR (30) NOT NULL
REFERENCES SchemaElettrico (Codice)
ON DELETE RESTRICT ON UPDATE CASCADE
);
CREATE TABLE Articolo
(
Matricola SERIAL PRIMARY KEY,
TipoArticolo INTEGER NOT NULL
REFERENCES TipoDiArticolo (Codice)
ON DELETE RESTRICT ON UPDATE CASCADE,
Cliente VARCHAR (16)
REFERENCES Cliente (PartitaIVA)
ON DELETE RESTRICT ON UPDATE CASCADE,
Note TEXT
);
CREATE TABLE Lavoro
(
Codice SERIAL PRIMARY KEY,
Tipo INTEGER NOT NULL CHECK (Tipo > 0),
DataInizioPrevista DATE NOT NULL,
DataTerminePrevista DATE NOT NULL,
Preventivo DECIMAL (9, 2),
OrePrevisteLavoro INTERVAL,
Priorita INTEGER NOT NULL CHECK (Priorita > 0),
StatoEsecuzione INTEGER NOT NULL CHECK (StatoEsecuzione > 0),
Prezzo DECIMAL (9, 2),
DataInizio DATE,
DataTermine DATE,
Responsabile VARCHAR (15) NOT NULL
REFERENCES Operatore (Codice)
ON DELETE RESTRICT ON UPDATE CASCADE,
Articolo INTEGER NOT NULL
REFERENCES Articolo (Matricola)
ON DELETE RESTRICT ON UPDATE CASCADE
);
CREATE TABLE Assegnazione
(
Operatore VARCHAR (15)
REFERENCES Operatore (Codice),
Lavoro INTEGER
REFERENCES Lavoro (Codice),
OreInterneOrdinarie INTERVAL NOT NULL,
OreEsterneOrdinarie INTERVAL NOT NULL,
OreInterneStraordinarie INTERVAL NOT NULL,
OreEsterneStraordinarie INTERVAL NOT NULL,
PRIMARY KEY (Operatore, Lavoro)
);
CREATE TABLE NonConformitaEst
(
Codice SERIAL PRIMARY KEY,
Lavoro INTEGER NOT NULL
REFERENCES Lavoro (Codice)
ON DELETE CASCADE ON UPDATE CASCADE,
Tipo INTEGER NOT NULL CHECK (Tipo > 0),
Note TEXT
);
CREATE TABLE NonConformitaInt
(
Codice SERIAL PRIMARY KEY,
Lavoro INTEGER NOT NULL
REFERENCES Lavoro (Codice)
ON DELETE CASCADE ON UPDATE CASCADE,
Tipo INTEGER NOT NULL CHECK (Tipo > 0),
OreDedicate INTERVAL NOT NULL,
Note TEXT
);
CREATE ASSERTION ResponsabileAssegnatoLavoro CHECK
(
EXISTS
(
SELECT *
FROM
LAVORO JOIN ASSEGNAZIONE
ON LAVORO.Codice = ASSEGNAZIONE.Lavoro
WHERE LAVORO.Responsabile = ASSEGNAZIONE.Operatore
)
);
CREATE ASSERTION ArticoloMontaggio CHECK
(
1 =
(
SELECT COUNT (*)
FROM
LAVORO JOIN ARTICOLO
ON LAVORO.Articolo = ARTICOLO.Matricola
WHERE LAVORO.Tipo = 1
)
);
CREATE ASSERTION OperatoreAssegnatoAttivo CHECK
(
0 =
(
SELECT COUNT (*)
FROM
OPERATORE JOIN ASSEGNAZIONE JOIN LAVORO
ON
ASSEGNAZIONE.Operatore = OPERATORE.Codice AND
ASSEGNAZIONE.Lavoro = Lavoro.Codice
WHERE OPERATORE.Attivo = FALSE AND LAVORO.StatoEsecuzione <> 3
)
);