도메인으로 또는 도메인으로


15

SQL92 및 SQL99 표준은 DDL 구성을 정의 합니다. 모든 데이터베이스가이를 지원하지 않거나 다른 이름을 가지고있는 것은 아닙니다 (예 : SQL Server에는 사용자 정의 유형이 있음 ).CREATE DOMAIN

이를 통해 데이터베이스에서 사용할 제한된 데이터 유형을 정의하여 허용 된 값과 관련된 규칙을 단순화하고 시행 할 수 있습니다. 이러한 데이터 유형은 열 선언, 저장 프로 시저 및 함수 등의 입력 및 출력에 사용될 수 있습니다.

나는 알고 싶다:

  • 사람들이 실제로 데이터베이스 디자인에서 도메인을 사용합니까?
  • 그렇다면 어느 정도입니까?
  • 그들은 얼마나 유용합니까?
  • 어떤 함정이 있습니까?

향후 데이터베이스 개발에서 이러한 기능을 사용할 수 있는지 평가하려고합니다.


1
나는 이것도 알고 싶다 ... 사람들의 말을 듣고 싶습니다.
maple_shaft

답변:


2

평소와 같이 ...

때에 따라 다르지

기본적으로 지원하는 데 상당한 노력 및 / 또는 중복 제약 조건 및 동작이 필요한 도메인 엔터티 가 여러 곳 에서 있습니까?

그렇다면 도메인을 멀리하십시오. 그렇지 않다면 귀찮게하지 마십시오.

위의 휴리스틱을 기반으로 SQL Server에서 사용자 정의 형식을 정확히 한 번만 만들어야한다는 것을 알았습니다. 나는 그것이 더 이상 무엇인지 기억하지 못합니다-그러나 그것은보다 더 많은 작업을 저장했습니다.


5

SQL Server 및 C # 사용자 는 응용 프로그램 측면에서 훨씬 강력하기 때문에 데이터베이스에서 사용자 정의 유형 을 사용하지 않았습니다 . LINQ to SQL 및 Entity Framework와 같은 ORM 이후의 이벤트에서 서버 기능 사용이 크게 줄었습니다.

예를 들어 CLR 통합을 사용하여 일부 DateTime 변환 함수를 SQL Server로로드하여 .NET의 세계화 기능을 기반으로 Gregorian 날짜 시간을 다른 형식으로 전송했습니다. 그러나 지금은 상황이 다르며 더 이상 그렇게하지 않습니다. 애플리케이션 레이어에서 바로 데이터를로드하고 변환을 수행합니다.

그래서 거의 4 년간의 프로그래밍과 내가 생각할 수있는 모든 팀을 조사한 후, 사용자 정의 유형을 사용하는 샘플을 찾지 못했습니다. 또한 많은 .NET 블로그에서 실제로 보지 못했습니다.

이것이 사람들이 Database Domain을 사용하지 않는다는 의미는 아니지만 최소한 Database Domain을 사용 하는 것이 일반적이지 않다는 것을 의미합니다 .


"응용 프로그램 측면에서 더 강력하기 때문에 데이터베이스에서 사용자 정의 유형을 사용하지 않았습니다" : 대신 제약 조건을 사용합니까? 이해가 안됩니다. 어떻게 적용 관점과 다른가요?
Arseni Mourzenko

예를 들어 @MainMa 는 데이터베이스 계층에 Student 클래스를 만들지 않습니다 . 정수 및 문자열과 같은 모든 기본 데이터 유형으로 학생 테이블을 만든 다음 ORM을 사용하여 모든 레코드를 응용 프로그램의 개체에 매핑합니다.
Saeed Neamati

이해했다. 네가 옳아.
Arseni Mourzenko

3

스택 오버플로에 대한 자세한 답변 이 이미 있습니다 . 나는 대부분 그것에 동의하지만 주어진 예제와는 다릅니다.

"예를 들어, 성별 필드에 적절한 데이터 만 허용되도록하는"GenderType "("N "이 아닌 char (1))을 정의합니다."

개인적으로, 나는 char(1)유형을 설정 하고 열에 대한 제약 조건을 정의하는 것이 더 편안하다고 생각 합니다. 제약 조건을 위반하면 내가 잘못한 것을 찾기 위해 어디에서 검색해야하는지 정확히 알 수 있습니다. 또한 사용자 정의 형식보다 더 잘 알려져 있으므로 제약 조건 만 사용하는 데이터베이스는 초보자가 이해하기 쉽습니다.

물론 개인적인 의견 일뿐입니다. 다른 사람들은 in ('M', 'F')제약 조건이 자체 문서화되지 않으며 데이터베이스를 발견 한 새로운 개발자에게는 매우 모호 할 수 있다고 말합니다 .

IMO, 더 복잡한 유형에는 사용자 정의 유형을 사용하고 기본 사항에는 제약 조건을 사용하십시오. 또한 유형의 명시적인 이름을 쉽게 찾을 수없는 경우 제약 조건이 더 적합 할 가능성이 있습니다.


자웅 동체는 어때?
와이엇 바넷

아니면 성관계? 아니면 transpeople?
Broam

1

이 기능을 직접 사용하지는 않았지만 다음을 확인해야합니다.

  1. 단일 시스템에서 데이터베이스를 사용하는 경우이 기능을 사용하지 않고 비즈니스 계층 또는 이와 동등한 시스템에 검사 로직을 추가하지 않는 것이 좋습니다. 이를 통해 유효성 검사 (예 : 정규식 사용)에 대한 유연성이 향상되고 모든 유효성 검사 논리를 한 곳에서 캡슐화 할 수 있습니다. 여러 시스템에서 데이터베이스를 공유하는 경우이 작업에 적합한 트리거를 대신 사용할 수 있습니다.

  2. 유효성 검사 오류가 발생했을 때 UDT를 사용하여 클라이언트에 반환되는 오류 메시지를 사용자 지정할 수 있는지 잘 모르겠습니다.

  3. UDT는 동일한 유효성 검사 규칙이 여러 열에 적용되는 경우 매우 유용합니다. 제 생각에는 표준화 된 데이터베이스 디자인을 사용하는 비즈니스 응용 프로그램에서 이것이 흔한 경우라고 생각하지 않습니다.

"[SQL Server] 사용자 정의 유형의 요점은 무엇입니까?" 를 확인하고 싶을 수도 있습니다. 블로그 기사.


1
세 번째 포인트는 +1입니다. 시간이 지남에 따라 제약 조건이 변경되어 여러 곳에서 변경해야 할 때 특히 동일한 제약 조건을 반복해서 작성하는 것이 가장 좋은 방법은 아닙니다.
Arseni Mourzenko

0

"모든 데이터베이스가이 기능을 지원하지는 않는다"고 말할 때는 다음과 같은 방법을 사용하는 것이 좋습니다.

모든 주요 데이터베이스는 트리거, 기능 및 기타 고급 기능을 광범위하게 지원하므로이를 지원합니다.

이것은 우리가 이것이 고급 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 인 경우 대신 부울 일 수 있습니다 (세 번째 및 네 번째 옵션을 제공하지 않는 한). 물론 우리는 이것이 열 오버 헤드로 인해 이것이 실제로 최적화되지는 않는다는 것을 알고 있지만 가능성이 있습니다.


특정 기능 (DOMAIN)이 모든 데이터베이스에서 지원되는 것은 아닙니다 . 예. 트리거, 제약 조건 및 함수를 사용하면 에뮬레이션 할 수 있지만 지원되는 기능은 아닙니다.
Oded

모든 주요 데이터베이스는 트리거, 기능 및 기타 고급 기능을 광범위하게 지원하므로이를 지원합니다. 정말 가벼운 기능을 갖춘 일부 사람들은 그렇지 않으며,이를 사용하는 사람은 제한이 사용자 특정 유형보다 훨씬 더
넓어지기

0

종이에 UDT는 훌륭한 개념입니다. 이를 통해 DB를 실제로 정규화하고 (예 : 서로 의존하는 두 개의 열이있는 경우) 새 유형과 관련된 모든 논리를 캡슐화 할 수 있습니다.

실제로, (현재) 지불하는 가격이 너무 높습니다. 분명히 개발 오버 헤드가 있지만 다양한 ORM 및보고 도구의 지원을 잃고 솔루션의 전반적인 복잡성을 상당히 증가시킵니다. UDT에 대해 친숙한 개발자가 너무 많지 않아 예제 외부에서 사용되는 관리되는 UDT를 본 적이 없습니다.

UDT (아직없는 경우)로 가장 잘 수행되는 형식의 가장 좋은 예 중 하나는 hierarchyid( MSDN link ) 여야 합니다. 효율성을 유지하기 위해 (보통 varchar 사용자 정의 구현과 달리) 이진 형식으로 값을 저장하므로 유형의 함수없이 유지 관리가 번거로울 수 있습니다. 유형이 제공하는 10 가지 정도의 방법은 외부 기능과 달리 유형의 일부로 제공하는 것이 가장 좋습니다. 이와 같은 경우 사용자 지정 관리 UDT를 사용하는 것이 좋습니다. 별도의 유형으로 효율적이고 깔끔한 구현을 제공함으로써 상당한 이점을 얻을 수 있습니다.


0

보다 실용적인 질문 / 답변. 회사에서 사용할 수 있습니까?

귀하의 회사는 다른 DDL을 처리하는 여러 DBSQL 브랜드와 협력하고 있습니까?

각 데이터베이스 브랜드는 사용자 정의 유형과 같은 우수한 추가 기능을 제공 할 수 있지만 회사에서 여러 DB를 사용하는 경우 비표준 기능에 문제가있을 수 있습니다.

회사 만 귀하이거나 귀하가 사용할 데이터베이스 및 기능을 결정할 수있는 경우 DDL을 사용할 수 있습니다

사용자 정의 유형이 유용 할 수있는 여러 프로젝트를 가지고 작업했지만 여러 DB를 처리해야했기 때문에 더 표준적인 기능을 사용해야합니다. (에스).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.