| 136 | |
| 137 | === **Индекси за подобрување на перформанси** === |
| 138 | |
| 139 | --за lookup на член и сортирање/филтер по датум[[br]] |
| 140 | CREATE INDEX IF NOT EXISTS ix_clenstvo_clenid_start[[br]] |
| 141 | ON clenstvo (clenid, start_datum DESC); |
| 142 | |
| 143 | Филтрирање само по датум[[br]] |
| 144 | CREATE INDEX IF NOT EXISTS ix_clenstvo_start[[br]] |
| 145 | ON clenstvo (start_datum); |
| 146 | |
| 147 | Најново членство по член[[br]] |
| 148 | CREATE INDEX IF NOT EXISTS ix_clenstvo_clenid_start_inc[[br]] |
| 149 | ON clenstvo (clenid, start_datum DESC) INCLUDE (paketid); |
| 150 | |
| 151 | Последни посети на член[[br]] |
| 152 | CREATE INDEX IF NOT EXISTS ix_poseti_clenid_datum[[br]] |
| 153 | ON poseti (clenid, datum DESC); |
| 154 | |
| 155 | Посети по локација[[br]] |
| 156 | CREATE INDEX IF NOT EXISTS ix_poseti_lokacija_datum[[br]] |
| 157 | ON poseti (lokacijaid, datum DESC); |
| 158 | |
| 159 | === **Тригери** === |
| 160 | |
| 161 | Автоматско броење посети кај член[[br]] |
| 162 | CREATE OR REPLACE FUNCTION trg_poseti_inc_broj_poseti()[[br]] |
| 163 | RETURNS trigger LANGUAGE plpgsql AS $$[[br]] |
| 164 | BEGIN[[br]] |
| 165 | UPDATE clenovi[[br]] |
| 166 | SET broj_poseti = COALESCE(broj_poseti, 0) + 1[[br]] |
| 167 | WHERE clenid = NEW.clenid; |
| 168 | RETURN NEW;[[br]] |
| 169 | END; $$;[[br]] |
| 170 | |
| 171 | DROP TRIGGER IF EXISTS poseti_inc_broj_poseti ON poseti;[[br]] |
| 172 | CREATE TRIGGER poseti_inc_broj_poseti[[br]] |
| 173 | AFTER INSERT ON poseti[[br]] |
| 174 | FOR EACH ROW[[br]] |
| 175 | EXECUTE FUNCTION trg_poseti_inc_broj_poseti();[[br]] |
| 176 | |
| 177 | Забрана за членство во иднина |
| 178 | |
| 179 | CREATE OR REPLACE FUNCTION trg_clenstvo_no_future_start()[[br]] |
| 180 | RETURNS trigger LANGUAGE plpgsql AS $$[[br]] |
| 181 | BEGIN[[br]] |
| 182 | IF NEW.start_datum > current_date THEN[[br]] |
| 183 | RAISE EXCEPTION 'start_datum (%) не смее да биде во иднина', NEW.start_datum;[[br]] |
| 184 | END IF;[[br]] |
| 185 | RETURN NEW;[[br]] |
| 186 | END; $$;[[br]] |
| 187 | |
| 188 | DROP TRIGGER IF EXISTS clenstvo_no_future_start ON clenstvo;[[br]] |
| 189 | CREATE TRIGGER clenstvo_no_future_start[[br]] |
| 190 | BEFORE INSERT OR UPDATE ON clenstvo[[br]] |
| 191 | FOR EACH ROW[[br]] |
| 192 | EXECUTE FUNCTION trg_clenstvo_no_future_start();[[br]] |
| 193 | |
| 194 | Автоматско пополнување start_datum ако е NULL[[br]] |
| 195 | CREATE OR REPLACE FUNCTION trg_clenstvo_default_start()[[br]] |
| 196 | RETURNS trigger LANGUAGE plpgsql AS $$[[br]] |
| 197 | BEGIN[[br]] |
| 198 | IF NEW.start_datum IS NULL THEN[[br]] |
| 199 | NEW.start_datum := current_date;[[br]] |
| 200 | END IF;[[br]] |
| 201 | RETURN NEW;[[br]] |
| 202 | END; $$;[[br]] |
| 203 | |
| 204 | DROP TRIGGER IF EXISTS clenstvo_default_start ON clenstvo;[[br]] |
| 205 | CREATE TRIGGER clenstvo_default_start[[br]] |
| 206 | BEFORE INSERT ON clenstvo[[br]] |
| 207 | FOR EACH ROW[[br]] |
| 208 | EXECUTE FUNCTION trg_clenstvo_default_start();[[br]] |
| 209 | |
| 210 | |
| 211 | === **Трансакции** === |
| 212 | |
| 213 | Трансакции за внес во повеќе табали[[br]] |
| 214 | BEGIN;[[br]] |
| 215 | --членство |
| 216 | INSERT INTO clenstvo (clenid, paketid, start_datum)[[br]] |
| 217 | VALUES (:clenid, :paketid, current_date)[[br]] |
| 218 | RETURNING clenstvoid;[[br]] |
| 219 | |
| 220 | --посета |
| 221 | INSERT INTO poseti (clenid, lokacijaid, datum)[[br]] |
| 222 | VALUES (:clenid, :lokacijaid, current_date);[[br]] |
| 223 | |
| 224 | -- врзувањље со тренер |
| 225 | -- INSERT INTO trenira (clenid, vrabotenid) VALUES (:clenid, :vrabotenid);[[br]] |
| 226 | |
| 227 | COMMIT; |
| 228 | |
| 229 | === **Cложени извештаи** === |
| 230 | [attachment:] |