PostgreSQL loomise laused


CREATE DOMAIN d_nimetus VARCHAR(50) NOT NULL
CONSTRAINT chk_nimetus_pole_tyhi CHECK (VALUE!~'^[[:space:]]*$');

CREATE TABLE Keel
(
	keel_kood char(3)	 NOT NULL,
	nimetus d_nimetus,
	on_aktiivne boolean NOT NULL   DEFAULT TRUE,
	CONSTRAINT PK_Keel PRIMARY KEY (keel_kood),
	CONSTRAINT AK_Keel_nimetus UNIQUE (nimetus),
	CONSTRAINT CHK_Keel_keel_kood CHECK (keel_kood~'^[a-z]{3}$')
);

CREATE TABLE Amet
(
	amet_kood smallint NOT NULL,
	nimetus d_nimetus,
	on_aktiivne boolean NOT NULL   DEFAULT TRUE,
	max_tootunde_nadalas smallint NOT NULL   DEFAULT 40,
	min_palk decimal(10,2) NOT NULL,
	CONSTRAINT PK_Amet PRIMARY KEY (amet_kood),
	CONSTRAINT AK_Amet_nimetus UNIQUE (nimetus),
	CONSTRAINT CHK_Amet_max_tootunde_nadalas CHECK (max_tootunde_nadalas BETWEEN 0 AND 50),
	CONSTRAINT CHK_Amet_min_palk CHECK (min_palk>1300),
	CONSTRAINT CHK_Amet_max_tootunde_nadalas_min_palk CHECK (NOT (max_tootunde_nadalas>40) OR min_palk>1600)
);

CREATE TABLE Tootaja
(
	tootaja_id serial NOT NULL,
	meiliaadress varchar(254)	 NOT NULL,
	synni_kp date NOT NULL,
	kontaktaadress varchar(100)	 NOT NULL,
	reg_aeg timestamp(0)	 NOT NULL   DEFAULT LOCALTIMESTAMP(0),
	on_aktuaalne boolean NOT NULL   DEFAULT FALSE,
	eesnimi varchar(50)	 NULL,
	perenimi varchar(50)	 NULL,
	amet_kood smallint NOT NULL,
	CONSTRAINT PK_Tootaja PRIMARY KEY (tootaja_id),
	CONSTRAINT AK_Tootaja_meiliaadress UNIQUE (meiliaadress),
	CONSTRAINT CHK_Tootaja_meiliaadress CHECK (meiliaadress LIKE '%@%'),
	CONSTRAINT CHK_Tootaja_synni_kp CHECK (synni_kp>='1920-01-01' AND synni_kp,
	CONSTRAINT CHK_Tootaja_kontaktaadress_pole_tyhi CHECK (kontaktaadress !~ '^[[:space:]]*$'),
	CONSTRAINT CHK_Tootaja_reg_aeg CHECK (reg_aeg>='2000-01-01' AND reg_aeg<'2100-01-01'),
	CONSTRAINT CHK_Tootaja_eesnimi CHECK (eesnimi!~'^[[:space:]]*$'),
	CONSTRAINT CHK_Tootaja_perenimi CHECK (perenimi!~'^[[:space:]]*$'),
	CONSTRAINT CHK_Tootaja_eesnimi_perenimi CHECK (eesnimi IS NOT NULL OR perenimi IS NOT NULL),
	CONSTRAINT CHK_Tootaja_reg_aeg_synni_kp CHECK (reg_aeg>synni_kp),
	CONSTRAINT FK_Tootaja_Amet FOREIGN KEY (amet_kood) REFERENCES Amet (amet_kood) ON DELETE No Action ON UPDATE Cascade
);

CREATE TABLE Keeleoskus
(
	tootaja_id integer NOT NULL,
	keel_kood char(3)	 NOT NULL,
	keeleoskuse_tase smallint NOT NULL,
	CONSTRAINT PK_Keeleoskus PRIMARY KEY (tootaja_id,keel_kood),
	CONSTRAINT CHK_Keeleoskus_keeleoskuse_tase CHECK (keeleoskuse_tase BETWEEN 1 AND 10),
	CONSTRAINT FK_Keeleoskus_Tootaja FOREIGN KEY (tootaja_id) REFERENCES Tootaja (tootaja_id) ON DELETE No Action ON UPDATE No Action,
	CONSTRAINT FK_Keeleoskus_Keel FOREIGN KEY (keel_kood) REFERENCES Keel (keel_kood) ON DELETE No Action ON UPDATE Cascade
);

CREATE TABLE Esindaja
(
	tootaja_id integer NOT NULL,
	esindustasu decimal(10,2) NOT NULL,
	CONSTRAINT PK_Esindaja PRIMARY KEY (tootaja_id),
	CONSTRAINT CHK_Esindaja_esindustasu CHECK (esindustasu>0),
	CONSTRAINT FK_Esindaja_Tootaja FOREIGN KEY (tootaja_id) REFERENCES Tootaja (tootaja_id) ON DELETE Cascade ON UPDATE No Action
);

CREATE INDEX IXFK_Tootaja_Amet ON Tootaja (amet_kood ASC);

CREATE INDEX IXFK_Keeleoskus_Keel ON Keeleoskus (keel_kood ASC);

                    

Lausendid ja atribuutide definitsioonid

Lausendid

Iga Keel on Klassifikaator
Iga Amet on Klassifikaator
Iga Klassifikaator on kas Keel või Amet, aga mitte mõlemat korraga
Igal töötajal on täpselt üks Amet
Igas Ametis töötab null või rohkem Töötajat
Igal Töötajal on null või rohkem Keeleoskust
Iga Keel on seotud null või rohkema Keeleoskusega
Iga Keeleoskus iseloomustab täpselt ühte Töötajat
Iga Keeleoskus on täpselt ühe Keele kohta
Ühel ja samal Töötajal ei saa sama Keele oskus olla registreeritud rohkem kui üks kord
Iga Esindaja on Töötaja
Mõni töötaja võib olla Esindaja

Atribuudid

Märkus: Atribuutide kirjeldustes esitatud piirangud (nt `@Kohustuslik`, `@Pole_tühi`, vahemikud, mustrid) viivad vastavate `NOT NULL`, `CHECK` või `UNIQUE` kitsenduste loomiseni SQL-is.


Olemitüüp: Amet
Atribuut: max_tootunde_nadalas
Selgitus inimkasutajale: Maksimaalne töötundide arv ühes nädalas, mis sellel töökohal on lubatud. Vaikimisi väärtus on 40.
Piirangud: {Täisarv.
@Kohustuslik.
Peab olema vahemikus 0-50 (otspunktid kaasa arvatud)}
Näiteväärtus: 40

Olemitüüp: Amet
Atribuut: min_palk
Selgitus inimkasutajale: Minimaalne tasu eurodes peale maksude mahaarvamist, mida selle ametikoha kandjale võib maksta.
Piirangud: {Püsikomaarv. Maksimaalselt 2 kohta peale koma.
@Kohustuslik.
Peab olema suurem kui 1300.
Kui töötunde nädalas on rohkem kui 40, siis minimaalne palk peab olema suurem kui 1600}
Näiteväärtus: 1400

Olemitüüp: Esindaja
Atribuut: esindustasu
Selgitus inimkasutajale: Esindaja esindustasu, mis on rahaline kompensatsioon esindaja rolli eest organisatsioonis. Tasu on eurodes kuus peale maksude maha arvamist.
Piirangud: {Püsikomaarv. Maksimaalselt 2 kohta peale koma.
@Kohustuslik.
Peab olema suurem kui 0.}
Näiteväärtus: 2000,75

Olemitüüp: Klassifikaator (abstraktne, vt Keel ja Amet)
Atribuut: kood
Selgitus inimkasutajale: Klassifikaatori unikaalne kood, mis identifitseerib konkreetse klassifikaatori (näiteks ameti või keele) süsteemis. Koodi kasutatakse klassifikaatori üheselt tuvastamiseks.
Piirangud: {Klassifikaatori unikaalne identifikaator.
Peab olema unikaalne klassifikaatori tüübi piires.
@Kohustuslik.
@Pole_tühi.
Keele puhul koosneb täpselt kolmest väiketähest.}
Näiteväärtus: est

Olemitüüp: Klassifikaator (abstraktne, vt Keel ja Amet)
Atribuut: nimetus
Selgitus inimkasutajale: Klassifikaatori nimi, mis kirjeldab selle tähendust (näiteks "juhataja" või "eesti keel"). Nimetus aitab inimkasutajal mõista, millist kategooriat või tüüpi klassifikaator esindab.
Piirangud: {Klassifikaatori unikaalne nimetus.
Peab olema unikaalne klassifikaatori tüübi piires.
Tekst.
Maksimaalselt 50 märki.
@Kohustuslik.
@Pole_tühi.}
Näiteväärtus: eesti keel

Olemitüüp: Klassifikaator (abstraktne, vt Keel ja Amet)
Atribuut: on_aktiivne
Selgitus inimkasutajale: Näitab, kas klassifikaator on hetkel aktiivne ja kasutatav süsteemis. Kui väärtus on true, on klassifikaator aktiivne ning kui false, siis mitte. Vaikimisi väärtus on true.
Piirangud: {Tõeväärtus.
@Kohustuslik.}
Näiteväärtus: true

Olemitüüp: Keeleoskus
Atribuut: keeleoskuse_tase
Selgitus inimkasutajale: Töötaja keeleoskuse tase antud keeles, mis on arv vahemikus 1 kuni 10, kus 1 tähendab algelist oskust ja 10 väga head oskust.
Piirangud: {Täisarv.
@Kohustuslik.
Keeleoskuse tase peab olema vahemikus 1 kuni 10 (otspunktid kaasa arvatud).}
Näiteväärtus: 7

Olemitüüp: Töötaja
Atribuut: meiliaadress
Selgitus inimkasutajale: Töötaja unikaalne meiliaadress, mida kasutatakse tema identifitseerimiseks ja temaga suhtlemiseks. Meiliaadress peab sisaldama vähemalt ühte @ märki.
Piirangud: {Töötaja unikaalne identifikaator.
Tekst.
Maksimaalselt 254 märki.
@Kohustuslik.
Meiliaadressis peab olema vähemalt üks @ märk.}
Näiteväärtus: jaan.tamm@example.com

Olemitüüp: Töötaja
Atribuut: sünni_kp
Selgitus inimkasutajale: Töötaja sünnikuupäev, mis näitab, millal töötaja on sündinud.
Piirangud: {Kuupäev.
@Kohustuslik.
Sünnikuupäev peab olema vahemikus 1920-01-01 kuni tänane kuupäev (otspunktid kaasa arvatud).}
Näiteväärtus: 1990-07-22

Olemitüüp: Töötaja
Atribuut: kontaktaadress
Selgitus inimkasutajale: Töötaja kontaktaadress, mis on tema füüsiline aadress, kuhu saab saata kirju või teavitusi.
Piirangud: {Tekst.
Maksimaalselt 100 märki.
@Kohustuslik.
@Pole_tühi.}
Näiteväärtus: Tallinn, Mustika 12-2

Olemitüüp: Töötaja
Atribuut: reg_aeg
Selgitus inimkasutajale: Aeg, millal töötaja registreeriti süsteemi. See näitab, millal töötaja andmed lisati andmebaasi. Vaikimisi väärtus on hetke kuupäev ja kellaaeg (sekundi täpsusega) ilma ajavööndi ja sekundi murdosadeta.
Piirangud: {Kuupäev ja kellaaeg (ilma ajavööndi ja sekundi murdosadeta).
@Kohustuslik.
Registreerimise aeg peab olema vahemikus 2000-01-01 kuni 2099-12-31 (otspunktid kaasa arvatud).
Registreerimise aeg peab olema hilisem kui sünnikuupäev.}
Näiteväärtus: 2000-01-01 14:56:12

Olemitüüp: Töötaja
Atribuut: on_aktuaalne
Selgitus inimkasutajale: Näitab, kas töötaja on hetkel aktiivne (tööl) või mitte. Kui väärtus on true, on töötaja aktiivne; kui false, siis mitte.
Piirangud: {Tõeväärtus.
@Kohustuslik.}
Näiteväärtus: true

Olemitüüp: Töötaja
Atribuut: eesnimi
Selgitus inimkasutajale: Töötaja eesnimi, mis on tema isikunime osa.
Piirangud: {Tekst.
Maksimaalselt 50 märki.
Kui eesnimi on registreeritud, siis @Pole_tühi.
Vähemalt üks kahest – kas eesnimi või perenimi peab olema registreeritud.}
Näiteväärtus: Jaan

Olemitüüp: Töötaja
Atribuut: perenimi
Selgitus inimkasutajale: Töötaja perenimi, mis on tema isikunime osa.
Piirangud: {Tekst.
Maksimaalselt 50 märki.
Kui perenimi on registreeritud, siis @Pole_tühi.
Vähemalt üks kahest – kas eesnimi või perenimi peab olema registreeritud.}
Näiteväärtus: Tamm