@vedun ты можешь проставить ограничение (constraint) на кастомный тип - это значительно упрощает работу с ограничениями.
Ну типа в JPA люди пишут
@Entity
class Whatever {
@NotNull
@AlphaNumeric
@MinLength(value=3)
@MaxValue(value=16)
@NotBlank
String someField;
}
Хотя тоже самое можно написать на SQL'e
CREATE DOMAIN some_field_of_whatever AS VARCHAR(64)
CONSTRAINT some_field_alphanum CHECK (VALUE ~ '^[[:alnum:]]+$')
CONSTRAINT some_field_min_length CHECK length(VALUE) > 3
CONSTRAINT some_field_max_length CHECK length(VALUE) < 16
CONSTRAINT some_filed_not_blank CHECK length(trim(both ' \n\t' from string)) > 0;
когда нужно поддерживать разные СУБД
В нормальных проектах люди нормально живут с одной СУБД и потребности её менять не возникает.
В некоторых случаях домены можно переиспользовать и гонять макросы на SQL'e.
Например вот так
CREATE FUNCTION create_last_updated_triggers(VARIADIC "tables" TEXT [])
RETURNS VOID AS $$
DECLARE
tbl TEXT;
BEGIN
FOREACH tbl IN ARRAY "tables"
LOOP
EXECUTE format('DROP TRIGGER IF EXISTS %s_last_updated ON %s;',tbl, tbl);
EXECUTE format('CREATE TRIGGER %s_last_updated BEFORE UPDATE ON %s ' ||
'FOR EACH ROW WHEN (OLD.* IS DISTINCT FROM NEW.*) ' ||
'EXECUTE PROCEDURE set_last_updated();',tbl, tbl);
END LOOP;
RAISE INFO 'Created last_updated triggers on %', "tables";
END;
$$ LANGUAGE plpgsql VOLATILE STRICT;
это только моё виденье подкреплённое небольшим опытом :)
Да, возможно это субъективно... и с моей стороны, т.к. дело привычек.