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