"모든 데이터베이스가이 기능을 지원하지는 않는다"고 말할 때는 다음과 같은 방법을 사용하는 것이 좋습니다.
모든 주요 데이터베이스는 트리거, 기능 및 기타 고급 기능을 광범위하게 지원하므로이를 지원합니다.
이것은 우리가 이것이 고급 SQL의 일부이며 어느 시점에서 의미가 있다는 결론을 가져옵니다.
Do people actually use domains in their database designs?
요구되는 광범위한 적용 범위 (연산자, 색인 등)로 인해 가능성이 줄어 듭니다.
If so to what extent?
다시 말하지만, 기존 유형이 약간의 추가 정의 된 로직 (예 : 검사 등)과 결합되어 트릭을 수행 할 수 있다면 왜 그렇게됩니까?
How useful are they?
아주 많이. MySQL과 같은 좋지 않은 DBMS를 1 초 동안 고려해 보겠습니다.이 예제에서는 한 가지 이유를 선택했습니다. inet (IP 주소) 유형에 대한 지원이 부족합니다.
이제 범위와 같은 모든 IP 데이터에 중점을 둔 응용 프로그램을 작성하려고합니다. 기본 유형과 제한된 기능에 집착하여 postgreSQL에서 기본적으로 지원되는 것과 같은 추가 기능과 연산자를 작성합니다 예) 또는 필요한 모든 기능에 대해 훨씬 더 복잡한 쿼리를 작성하십시오.
이것은 자신의 함수를 정의하는 데 소비 된 시간을 쉽게 정당화하는 경우입니다 (PostgreSQL의 inet >> inet : 범위 연산자에 포함 된 범위).
이 시점에서 확장 데이터 유형 지원을 이미 정당화했으며 새 데이터 유형을 정의하는 다른 단계는 하나뿐입니다.
이제는 실제로 멋진 유형 지원을하지만 서명되지 않은 int.가없는 PostgreSQL로 돌아갑니다. 저장소 / 성능에 대해 정말로 염려하기 때문에 (아는 사람은 ...) 연산자-물론 이것은 주로 기존 int 연산자를 유도합니다.
What pitfalls have you encountered?
지금까지 필요한 시간을 정당화하고 정당화 할 수있는 프로젝트가 없었기 때문에 그 문제를 해결하지 못했습니다.
내가 볼 수있는 가장 큰 문제는 휠을 재발 명하고 "안전한"레이어 (db)에 버그를 도입하고 불완전한 유형 지원으로 수개월 후 CONCAT (cast * AS varchar)가 실패했을 때만 실현 될 수있는 불완전한 유형 지원입니다. 캐스트 (vartype으로 newtype) 등을 정의하지 않았습니다.
"흔하지 않은"등에 대한 답변이 있습니다. 확실히 이것들은 드문 일이며 드 물어야합니다 (그렇지 않으면 dbms에 중요한 유형이 많이 없다는 것을 의미합니다). 반면에, (좋은) db는 ACID 호환 ( 응용 프로그램과 달리) 일관성과 관련된 모든 것이 더 잘 유지됩니다.
비즈니스 로직이 소프트웨어 계층에서 처리되는 경우가 많으며 더 안전한 SQL에서 수행 될 수 있습니다. 응용 프로그램 개발자는 응용 프로그램 계층 내에서보다 편안하게 느끼고 SQL로 구현 된 더 나은 솔루션을 피하는 경우가 많으므로 좋은 방법으로 간주해서는 안됩니다.
UDT는 최적화를위한 좋은 솔루션이 될 수 있습니다. char (1)을 사용하는 m / f 유형에 대한 또 다른 대답에는 좋은 예가 있습니다. UDT 인 경우 대신 부울 일 수 있습니다 (세 번째 및 네 번째 옵션을 제공하지 않는 한). 물론 우리는 이것이 열 오버 헤드로 인해 이것이 실제로 최적화되지는 않는다는 것을 알고 있지만 가능성이 있습니다.