Kodulehed
[381] - Andmebaasid II (ITI0207) (sügis 2021)
Esiletöstetud Kiirvalik
Lisainfo Kõige olulisemate tegevuste kiirvalik. Failide saatmiseks valige Vastamine alt sobiv ülesanne.
Üldist
Materjalid
LisainfoMaterjalide kataloogid.
Värvilised mummud tähistavad hinnangulist kataloogide lugemise vajadust. Roheline - suurim, kollane - keskmine, punane või mummuta - väikseim
Isiklik
Lisainfo Info ainult Sulle - teised kasutajad seda ei näe
Abi
Lisainfo Võimalus küsida õppejõult abi (nagu foorum, kus saab küsida küsimusi ja kommenteerida vastuseid)
Mitmesugust
Abi / Kasutajatugi / PostgreSQL

Avalikud küsimused ja vastused:

Küsimuste teemade nimekiri

Anonüümne:
Kas isiku rollide omamise registreerimise võiks realiseerida nii, et luua loendustüüp rollide nimedega ning kasutajate tabelis luua veerg, mille väärtuseks on seda loendustüüpi väärtuste massiiv?
Vastus: See on võimalik, aga ma ei soovita. Soovitan rollide jaoks luua eraldi klassifikaatori tabeli ja luua eraldi tabeli rollide omamiste kohta.

CREATE TYPE t_roll AS ENUM('juhataja','administraator','tavakasutaja');

CREATE TABLE Isik (isik_id SERIAL NOT NULL,
rollid t_roll[] NOT NULL,
CONSTRAINT pk_isik PRIMARY KEY (isik_id));

Mis on selle lahenduse probleemid?

1. Isiku rollide hulga muutmiseks tuleb kogu massiiv uue väärtusega (massiiviga) asendada.
2. Massiiv võib sisaldada korduvaid elemente.
3. Kui rolli omamise kohta on vaja hakata koguma uusi andmeid (nt alguse ja lõpu aeg), siis tuleb kogu disain ümber teha.
4. Porditavus. Loendustüübid on PostgreSQL lisavõimalus. Massiivitüübi generaatori kasutamise võimalust näeb SQL standard ette, kuid erinevates süsteemides on erinevad kasutamise süntaksid ja põhimõtted.
5. Jõudlus. Järgnev katse tehti PostgreSQL (13) andmebaasis.
 
Tabelis health_care_visit_role on 1.3 miljonit rida.

CREATE TABLE hcv_role_agg AS
SELECT health_care_visit_id, array_agg(role_type_code) AS roles
FROM health_care_visit_role
GROUP BY health_care_visit_id;

ALTER TABLE hcv_role_agg ADD CONSTRAINT pk_hcv_role_agg PRIMARY KEY (health_care_visit_id);
 
Päring ilma massiivita tabelist.
EXPLAIN ANALYZE SELECT health_care_visit_id
FROM health_care_visit_role
WHERE role_type_code='DOC03';

Täitmise aeg umbes 160 ms
 
Päring tabelist, kus rollid on massiivis.
EXPLAIN ANALYZE SELECT health_care_visit_id
FROM hcv_role_agg
WHERE 'DOC03'=ANY(roles);

Täitmise aeg umbes 340 ms

Hinda vastust:

Keskmine hinne : Pole veel hinnanguid!