[Postgres] Constraint wydajność

0

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.

0

nie prościej i na pewno szybciej zrobić to na ograniczeniach CHECK dla kolumn (mogą być tam regexpy)

0

Tak, jednak chciałbym w dynamiczny sposób modyfikować ograniczenia, regex'y itp.

1 użytkowników online, w tym zalogowanych: 0, gości: 1