Changes between Version 3 and Version 4 of Нормализација и подобрувања на дизајнот


Ignore:
Timestamp:
08/26/25 21:17:29 (33 hours ago)
Author:
183284
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Нормализација и подобрувања на дизајнот

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