Witam,
Tworze bazę danych w Postgresie. Chciałbym się dowiedzieć czy poniższe rozwiązanie jest wydajne, czy może lepiej rozwiązać to poprzez aplikacje pośredniczącą.
Tworze sobię przykładową tabele zawierającą warunki poprawności:
CREATE TABLE warunki_poprawnosci (
min_name_length INTEGER NOT NULL,
max_name_length INTEGER NOT NULL
);
INSERT INTO warunki_poprawnosci VALUES (3, 30);
Na jej podstawie działały by funkcje sprawdzające, przykładowo:
CREATE OR REPLACE FUNCTION sprawdz_imie(text)
RETURNS bool AS
$BODY$
DECLARE
p_name ALIAS FOR $1;
v_min_name_length INTEGER;
v_max_name_length INTEGER;
r_warunki_poprawnosci RECORD;
BEGIN
SELECT * INTO r_warunki_poprawnosci FROM warunki_poprawnosci;
v_min_name_length := r_warunki_poprawnosci.min_name_length;
v_max_name_length := r_warunki_poprawnosci.max_name_length;
IF LENGTH(p_name) < v_min_name_length THEN
RAISE EXCEPTION 'Imie za krótkie, musi być > %', v_min_name_length;
END IF;
IF LENGTH(p_name) > v_max_name_length THEN
RAISE EXCEPTION 'Imie za dlguie, musi być > %', v_max_name_length;
END IF;
RETURN true;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE COST 100;
W przypadku nieprawidłowości funkcja wyrzucałaby wyjątki obsługiwane przez aplikacje, których treść zostałaby zwracana użytkownikowi.
Konstrukcja przykładowej tabeli wyglądała by tak:
CREATE TABLE uzytkownicy (
UID TEXT NOT NULL,
imie TEXT NOT NULL,
CONSTRAINT PK_UZYT_UID PRIMARY KEY (UID),
CONSTRAINT CK_UZYT_IMIE CHECK(sprawdz_imie(imie))
);
Dane były sprawdzane również za pośrednictwem wyrażeń regularnych itp.