상호 배타적 인 서브 클래스로 타입 / 서브 타입 디자인 패턴에서 서브 타입의 서브 타입 구현


20

소개

이 질문이 미래의 독자들에게 유용하기 위해 나는 일반적인 데이터 모델을 사용하여 내가 직면 한 문제를 설명 할 것이다.

우리의 데이터 모델은 3 개의 엔티티로 구성되며 A, B및 로 표시됩니다 C. 일을 단순하게 유지하기 위해 모든 속성은 int유형이됩니다.

엔티티 A의 속성을 다음했습니다 D, E그리고 X;

엔티티 B의 속성을 다음했습니다 D, E그리고 Y;

엔티티 C의 속성을 다음했습니다 DZ;

모든 엔티티가 공통 속성을 공유하므로 유형 / 하위 유형 디자인 D을 적용하기로 결정했습니다 .

중요 : 엔티티는 상호 배타적입니다! 이는 엔터티가 A 또는 B 또는 C임을 의미합니다.

문제:

엔터티 AB또 다른 공통 특성 E이 있지만이 특성은 엔터티에 없습니다 C.

의문:

가능한 경우 위에서 설명한 특성을 사용하여 디자인을 더욱 최적화하고 싶습니다.

솔직히 말해서, 나는 이것을하는 방법이나 시도를 시작할 곳, 그래서이 게시물을 모른다.

답변:


6

이 질문이 계속되는 한 타입 / 서브 타입 디자인 패턴 (상호 배타적 인 서브 클래스에 대한)의 구현이 정확합니까? 변수 자체 를 관계형 테이블로 변환하는 방법을 모른다면 다음과 같이 묻습니다. 정확히 무엇 을 최적화하려고합니까? 저장? 객체 모델? 쿼리 복잡성? 쿼리 성능? 모든 측면을 동시에 최적화 할 수 없으므로 한 측면과 다른 측면을 최적화 할 때 절충점이 있습니다.

나는 다음에 관한 Remus의 요점 에 전적으로 동의합니다 .

  • 각 접근법에는 장단점이 있습니다 (즉, 항상 존재하는 "의존하는"요인).
  • 우선 순위는 데이터 모델의 효율성입니다 (비효율적 인 데이터 모델은 깨끗하고 효율적인 앱 코드로 수정할 수 없습니다)

즉, 당신이 직면 한 선택은 가장 표준화 된 것부터 가장 표준화 된 순서대로 정렬 된 다음 중 하나입니다.

  • E기본 유형 테이블로 특성 승격
  • 여러 하위 유형 테이블에 유지
  • 완전히 정상화 E와 같은 수준에서 새로운 중간 서브 클래스 테이블에게 C, 그 AB직접적으로의 하위 클래스가 될 것입니다 ( MDCCL의 대답 @ )

각 옵션을 살펴 보자.

E기본 유형 테이블로 특성 이동

프로

  • 쿼리 그 필요성에 대한 감소 된 쿼리의 복잡성 E하지만 X, Y또는 Z.
  • 잠재적으로 더 효율적으로 필요로하는 쿼리 E가 아니라 X, Y또는 Z인해 no로 (특히 집계 쿼리) 가입.
  • 인덱스를 생성 할 수 (D, E)있는 가능성 (있는 (D, E)경우 EntityType <> 위치 에서 필터링 된 인덱스 C가있을 수 있음)

단점

  • 표시 할 수 없습니다 ENOT NULL
  • EntityType = 일 때 (이것은 큰 문제는 아니지만) CHECK CONSTRAINT기본 유형 테이블에 추가 가 필요합니다 .E IS NULLC
  • EntityType = 일 때 데이터 모델 사용자에게 이유 E가 무엇인지 NULL, 그리고 완전히 무시해야하는지 교육 해야합니다 C.
  • 때 약간 덜 효율적인 E고정 길이 형이며, 중 EntityType 대한 열의 많은 부분이다 C(즉, 사용하지 않는 E, 따라서 그것이 NULL) 사용하지 어느 SPARSE클러스터 된 인덱스의 열 또는 데이터 압축에 대한 옵션
  • 기본 유형 테이블에 E존재하기 때문에 필요하지 않은 쿼리의 경우 잠재적으로 효율성 E이 떨어 지므로 각 행의 크기가 증가하여 데이터 페이지에 맞는 행 수가 줄어 듭니다. 그러나 이것은 정확한 데이터 유형 인 EFILLFACTOR, 기본 유형 테이블에있는 행 수 등에 크게 의존 합니다.

E각 하위 유형 테이블에서 속성 유지

프로

  • 보다 깨끗한 데이터 모델 (즉 E, "실제로 존재하지 않기 때문에"기본 유형 테이블의 열 을 사용하지 않아야하는 이유에 대해 다른 사람들을 교육 할 필요 가 없습니다)
  • 아마도 객체 모델과 더 가깝습니다.
  • NOT NULL이것이 엔티티의 필수 특성 인 것처럼 열을 표시 할 수 있습니다.
  • EntityType = 일 때 (이것이 큰 이득은 아니지만) CHECK CONSTRAINT기본 유형 테이블 에 추가가 필요 하지 않습니다.E IS NULLC

단점

  • 이 속성을 가져 오려면 JOIN이 테이블을 하위 유형으로 지정해야합니다.
  • E행 수에 비해 A+ 행 수에 따라 JOIN으로 인해 필요할 때 약간 효율이 떨어질 수 있습니다.BC
  • 약간 더 어려운 / 복잡한 엔티티만을 다루는 작업 AB(와 하지 C 동일 "유형"인 것으로). 물론, 당신이 할 수있는 않는보기를 통해이 추상 UNION ALL사이 SELECT의 조인 된 테이블의 A또 다른 SELECT의 조인 된 테이블의 B. 즉 SELECT 쿼리의 복잡성 만에 그렇게 도움이되지 줄일 수 INSERTUPDATE쿼리를.
  • 특정 쿼리와 실행 빈도에 따라 인덱스를 설정 (D, E)하면 하나 이상의 자주 사용되는 쿼리를 함께 인덱스 할 수 없으므로 실제로 도움이 되는 경우 비효율적 일 수 있습니다.

E기본 클래스와 A& 사이의 중개 테이블로 정규화B

(나는 상황에 따라 @MDCCL의 대답 을 실행 가능한 대안으로 좋아한다는 점에 유의하십시오 . 내가 이미 제안한 두 가지 옵션과 같은 맥락에서이를 통해 전체 정규화와 현재 부분 정규화 접근법의 상대적인 차이로 보이는 것을 더 쉽게 확인할 수 있습니다.)

프로

  • 데이터 모델이 완전히 정규화되었습니다 (RDBMS가 수행하도록 설계된 것이기 때문에 본질적으로 잘못된 것은 없습니다)
  • A및 필요로 B하지 않는 쿼리에 대한 쿼리 복잡성 감소 C(예 :를 통해 연결된 두 쿼리가 필요 없음 UNION ALL)

단점

  • 약간 더 많은 공간이 사용됨 ( Bar테이블이 ID를 복제하고 새 열이 있음 BarTypeCode) [무시할 수 있지만 알아야 할 사항]
  • 또는 JOIN에 도달하기 위해 추가 가 필요 하므로 쿼리 복잡성이 약간 증가AB
  • 거래가 기본 클래스 테이블에서 약간 더 길게 열리기 때문에 (즉 , 무시할 수는 있지만) 잠금을위한 노출 된 표면적 증가 INSERT( 대부분 DELETE외래 키 표시를 통해 암시 적으로 처리 가능 )ON CASCADE DELETEFoo
  • 실제 유형에 대한 직접적인 지식이 A없거나 B기본 클래스 Table 내에서 Foo; 그것은 단지 유형을 알고 Br이 될 수있는 A또는 B:

    즉, 일반 기본 정보에 대해 쿼리를 수행해야하지만 엔티티 유형별로 분류하거나 하나 이상의 엔티티 유형을 필터링해야하는 경우 기본 클래스 테이블에 충분한 정보가 없으므로이 경우 필요한 정보가 없습니다. 테이블. 또한 열 을 인덱싱하는 효과가 줄어 듭니다 .LEFT JOINBarFooTypeCode

  • A& Bvs 와 상호 작용하는 일관된 접근 방식이 없습니다 C.

    즉, 각 엔터티가 기본 클래스 테이블과 직접 관련되어 전체 엔터티를 가져 오기 위해 하나의 JOIN 만 있으면 데이터 모델 작업에 대해 모든 사람이 더 쉽고 빠르게 친숙해질 수 있습니다. 쿼리 / 저장 프로 시저에 대한 일반적인 접근 방식이 있으므로 개발 속도가 빨라지고 버그가 발생할 가능성이 줄어 듭니다. 또한 일관된 접근 방식을 통해 향후 새로운 하위 유형을 더 빠르고 쉽게 추가 할 수 있습니다.

  • 시간이 지남에 따라 변경되는 비즈니스 규칙에 대한 적응력이 떨어질 수 있습니다.

    의미는 항상 변경 E되며 모든 하위 유형에 공통이되면 기본 클래스 테이블 로 올라가는 것이 매우 쉽습니다 . 엔터티의 특성 변화로 인해 가치있는 변화가 생기면 공통 속성을 하위 유형으로 옮기는 것도 쉽습니다. 하위 유형을 두 개의 하위 유형으로 나누거나 (다른 SubTypeID값만 작성 ) 두 개 이상의 하위 유형을 하나로 결합 하는 것은 쉽습니다 . 반대로 E나중에 나중에 모든 하위 유형의 공통 속성이 되면 어떻게 됩니까? 그러면 Bar테이블 의 중간 계층은 의미가 없으며 추가 된 복잡성은 가치가 없습니다. 물론, 그러한 변화가 5 년에서 10 년 안에 일어날 지 알 수 없기 때문에 Bar테이블이 반드시 그런 것은 아닙니다.나쁜 아이디어 일 가능성도 높지 않습니다 ( " 잠재적으로 적응력이 떨어짐" 이라고 말한 이유 ). 이것들은 고려할 점입니다. 그것은 어느 방향 으로든 도박입니다.

  • 잠재적으로 부적절한 그룹화 :

    방금 때문에, 의미 E속성이 엔티티 유형간에 공유 A하고 B그 뜻은 아닙니다 A하고 B 한다 그룹화. 사물이 똑같이 (즉, 같은 성질) "보인다"고해서 동일한 것을 의미하지는 않습니다.

개요

비정규 화 여부를 결정하는 것과 마찬가지로이 특정 상황에 가장 잘 접근하는 방법은 다음과 같은 데이터 모델 사용 측면을 고려하고 이점이 비용을 능가하는지 확인하는 것입니다.

  • 각 EntityType에 대해 몇 개의 행을 가질 것인지
  • 각 테이블 (기본 유형 및 하위 유형)이 5 년 동안 몇 GB가 될까요?
  • 특정 데이터 유형은 속성 E
  • 하나의 속성입니까 아니면 몇 가지 또는 몇 가지 속성이 있습니까?
  • 필요한 쿼리 E및 실행 빈도
  • 필요하지 않은 쿼리 E와 실행 빈도

나는 E적어도 "깨끗한"것이기 때문에 별도의 하위 유형 테이블 을 유지하는 경향이 있다고 생각 합니다. E기본 유형 테이블 IF 로 이동 하는 것이 좋습니다. IF : 대부분의 행은 EntityType 이 아닙니다C . 행의 수는 수백만 적어도이었다; 그리고 자주 실행되지 않는 쿼리 E및 / 또는 인덱스의 이점을 얻을 수있는 쿼리는 (D, E)매우 자주 실행되거나 충분한 시스템 리소스를 필요로하여 인덱스가 있으면 전체 리소스 사용률이 감소하거나 최소한 수용 가능한 수준을 초과하거나 과도한 차단 및 / 또는 교착 상태의 증가를 일으킬 정도로 오래 지속되는 자원 소비 급증.


최신 정보

OP 는이 답변에 다음과 같이 논평 했습니다.

고용주는 비즈니스 로직을 바꾸어 E를 완전히 제거했습니다!

이 변경 사항은 위의 " E기본 클래스와 A& 사이의 중간 테이블에 대해 일반화 테이블 "섹션의 "CONs"하위 B섹션 (제 6 탄환 점) 에서 발생할 수있는 정확한 예측값이므로 특히 중요합니다 . 구체적인 문제는 이러한 변경이 발생할 때 (그리고 항상 그렇게 할 때) 데이터 모델을 리팩토링하는 것이 얼마나 쉽고 어려운지입니다. 어떤 사람들은 모든 데이터 모델을 리팩토링 / 변경할 수 있다고 주장 할 것이다. 그러나 기술적 으로는 리팩토링 할 수있는 것이 사실이지만 상황의 현실은 규모의 문제입니다.

리소스는 CPU / 디스크 / RAM뿐만 아니라 개발 리소스 : 시간과 돈까지 무한합니다. 비즈니스는 자원이 매우 제한되어 있기 때문에 프로젝트에 대한 우선 순위를 지속적으로 설정하고 있습니다. 그리고 종종 (적어도 내 경험으로는) 효율성을 얻는 프로젝트 (시스템 성능은 물론 빠른 개발 / 버그 수 감소)는 기능을 높이는 프로젝트보다 우선 순위가 높습니다. 리팩토링 프로젝트의 장기적인 이점이 무엇인지 이해하기 때문에 기술 담당자에게는 실망 스럽지만 기술이 부족한 비즈니스 담당자는 새로운 기능과 새로운 기능 간의 직접적인 관계를 쉽게 볼 수있는 것은 비즈니스의 특성 일뿐입니다. 수익. 이것으로 요약되는 것은 : "나중에 고치기 위해 다시 올 것이다"== "

이를 염두에두고, 데이터의 크기가 충분히 작아서 변경 사항을 쿼리 할 수있을뿐만 아니라 변경 작업을 수행 할뿐만 아니라 문제가 발생할 경우 롤백 할 수있는 유지 관리 기간이있을 경우 잘못하고 정상화 E기본 클래스 테이블과 사이의 중간 표에 밖으로 AB하위 클래스는 테이블이 특정 유형의 직접적인 지식을 가진하지만 그 여전히 잎을 (일할 수있는 ( A또는B)를 기본 클래스 표에서). 그러나 이러한 테이블에 수억 개의 행이 있고 테이블을 참조하는 엄청난 양의 코드 (변경 될 때 테스트해야하는 코드)가있는 경우 일반적으로 이상주의보다 실용적입니다. 그리고 이것이 제가 수년간 처리해야 할 환경입니다. 기본 클래스 테이블에서 9 억 9,900 만 행 및 615GB가 18 대의 서버에 분산되어 있습니다. 그리고 많은 코드가 이러한 테이블 (기본 클래스 및 하위 클래스 테이블)에 부딪 히게되면서 (대부분의 경영진이나 때로는 팀의 다른 사람들이) 개발 량과 할당해야 할 QA 리소스

따라서 다시 한 번 "최상의"접근 방식은 상황에 따라 결정될 수 있습니다. 시스템 (데이터 양과 테이블과 코드의 관계), 리팩토링 수행 방법 및 사람을 알아야합니다. 당신과 함께 일하는 것 (팀과 경영진-그러한 프로젝트를 위해 그들의 바이 인을 얻을 수 있습니까?) 1-2 년 동안 언급하고 계획 한 일부 변경 사항이 있으며 85 % 정도 구현하기 위해 여러 번의 스프린트 / 릴리스가 필요했습니다. 그러나 <백만 개의 행만 있고 이러한 테이블에 묶인 코드가 많지 않으면 더 이상적인 / "순수한"측면에서 시작할 수 있습니다.

어떤 방법을 선택하든 적어도 2 년 동안 (가능한 경우) 해당 모델의 작동 방식에주의를 기울이십시오. 당시 최고의 아이디어처럼 보였지만 효과가 있었던 것과 고통을 일으킨 원인에주의를 기울이십시오 (즉, 정직하게 고통 지점을 평가할 수 있도록 나사를 조일 수 있도록해야합니다. ). 다음 결정에 더 잘 맞을 수있는 결정을 내릴 수 있도록 특정 결정이 효과가 있거나 그렇지 않은 이유에 주의하십시오 .


17

Martin Fowler에 따르면 테이블 상속 문제에 대한 세 가지 접근 방식이 있습니다.

  • 단일 테이블 상속 : 하나의 테이블은 모든 유형을 나타냅니다. 사용하지 않는 속성은 NULL입니다.
  • 콘크리트 테이블 상속 : 콘크리트 유형 당 하나의 테이블, 각 테이블 유형의 각 속성에 대한 열. 테이블 간 관계가 없습니다.
  • 클래스 테이블 상속 : 유형 당 하나의 테이블, 각 테이블에는 상속되지 않은 새로운 속성에 대한 속성 만 있습니다. 테이블은 실제 유형 상속 계층 구조를 반영하여 관련됩니다.

이를 시작점으로 시작하여 각 접근 방식의 장단점을 검색 할 수 있습니다. 그것의 요점은 모든 접근 방식에 큰 단점 이 있으며 압도적 인 이점이 없다는 것입니다. 객체 관계형 임피던스 불일치 로 더 잘 알려진 이 문제는 아직 해결책을 찾지 못했습니다.

개인적으로 나쁜 관계형 디자인으로 인해 발생할 수있는 문제 유형 은 나쁜 유형 디자인으로 인해 발생하는 문제보다 훨씬 더 심각합니다 . 데이터베이스 디자인이 잘못되면 쿼리 속도가 느려지고 비정상적인 데이터 크기 폭발, 교착 상태 및 응답하지 않는 앱이 발생하며 수십에서 수백 기가 바이트의 데이터가 잘못된 형식으로 가라 앉습니다 . 잘못된 유형의 디자인은 런타임이 아니라 코드 를 유지 관리하고 업데이트하기가 어렵습니다 . 따라서 필자의 책에서 올바른 관계형 디자인은 모든 OO 유형 순도를 반복해서 능가합니다.


@AlwaysLearningNewStuff이 질문은 dba.stackexchange.com/questions/139092 에 대한 후속 조치라고 생각합니다 . 맞습니까? 구현 당신이 테이블 상속을 가지고있다.
Remus Rusanu

그렇습니다.이 질문을하기 전에 먼저 유형 / 하위 유형 디자인을 구현하는 방법을 올바르게 이해하고 싶었습니다. 이제 일부 하위 클래스가 공유 속성을 가질 때 위에서 설명한 문제에 직면 합니다. 그 뉘앙스를 무시하지 않고 그 경우에 데이터 모델을 최적화하기 위해 할 수있는 일이 있는지 궁금합니다.
AlwaysLearningNewStuff

6

귀하의 사양에 대한 나의 해석에 따르면, 두 개의 서로 다른 (그러나 연결된 ) 수퍼 타입 ​​서브 타입 구조 를 구현하는 방법을 찾고 싶습니다 .

앞서 언급 한 과제를 달성하기위한 접근 방식을 폭로하기 위해 and 라는 두 가지 고전적인 가상 엔티티 유형 을 발행하는 시나리오에 추가 하겠습니다.FooBar

비즈니스 규칙

다음은 논리 모델을 만드는 데 도움이되는 몇 가지 설명입니다.

  • A Foo is either one Bar or one C
  • A Foo is categorized by one FooType
  • A Bar is either one A or one C
  • A Bar is classified by one BarType

논리 모델

그런 다음 결과 IDEF1X [1] 논리 모델이 그림 1에 표시됩니다 (그리고 Dropbox에서 PDF로 다운로드 할 수도 있음 ).

그림 1-가상 수퍼 타입-서브 타입 관계 데이터 모델

푸와 바 추가

나는 추가하지 않은 FooBar더 나은 모델 보이게하지만 더 표현하기 위해. 나는 그들이 다음과 같은 이유로 중요하다고 생각합니다.

  • 따라 AB라는 이름의 속성을 공유하는 E이 기능은 제시 가의 subentity 유형 것을 별개의 (그러나 관련) 종류의 개념 , 이벤트 , 사람 , 측정 나는에 의해 표현 등, Barsuperentity 유형 차례로하다는 것을 하위 엔터티 유형의이며 Foo,이 D속성은 계층의 맨 위에 특성 을 보유합니다 .

  • C논의중인 나머지 엔티티 유형과 하나의 속성 만 공유 하므로 D,이 측면 은 다른 유형의 개념 , 이벤트 , 사람 , 측정 등의 하위 엔티티 유형이라는 것을 암시 하므로이 상황을 다음과 같은 이유로 설명했습니다 . 슈퍼 개체 유형.Foo

그러나 이것은 가정 일 뿐이며 관계형 데이터베이스는 특정 비즈니스 컨텍스트 의 의미를 정확하게 반영하기 위해 특정 도메인에서 관심 있는 모든 사항 을 식별하고 분류 하여 더 많은 의미를 포착 할 수 있도록해야합니다. .

디자인 단계에서 중요한 요소

모든 용어를 제외하고 배타적 인 수퍼 타입-서브 타입 클러스터는 일반적인 관계라는 사실을 알고있는 것이 매우 유용합니다. 다음과 같은 방식으로 상황을 설명하겠습니다.

  • 독점적 슈퍼 엔티티 유형 발생은 하나의 하위 엔티티 유형 보완 에만 관련됩니다 .

따라서 이러한 경우 일대일 (1 : 1)의 대응 (또는 카디널리티)이 있습니다.

이전 게시물에서 알 수 있듯이 판별 기 속성 (구현시 열) 은 이러한 유형 의 연관 을 작성할 때 수퍼 타입이 연결된 올바른 하위 유형 인스턴스를 나타 내기 때문에 가장 중요한 역할 을합니다 . 마이그레이션 (I) 상위 유형에서 PRIMARY KEY의 (ii)는 하위 유형은 또한 주요 의미입니다합니다.

콘크리트 DDL 구조

그런 다음 위에 제시된 논리 모델을 기반으로하는 DDL 구조를 작성했습니다.

CREATE TABLE FooType -- Look-up table.
(
    FooTypeCode     CHAR(2)  NOT NULL,
    Description     CHAR(90) NOT NULL, 
    CreatedDateTime DATETIME NOT NULL,
    CONSTRAINT PK_FooType             PRIMARY KEY (FooTypeCode),
    CONSTRAINT AK_FooType_Description UNIQUE      (Description)
);

CREATE TABLE Foo -- Supertype
(
    FooId           INT      NOT NULL, -- This PK migrates (1) to ‘Bar’ as ‘BarId’, (2) to ‘A’ as ‘AId’, (3) to ‘B’ as ‘BId’, and (4) to ‘C’ as ‘CId’.
    FooTypeCode     CHAR(2)  NOT NULL, -- Discriminator column.
    D               INT      NOT NULL, -- Column that applies to ‘Bar’ (and therefore to ‘A’ and ‘B’) and ‘C’.
    CreatedDateTime DATETIME NOT NULL,
    CONSTRAINT PK_Foo                 PRIMARY KEY (FooId),
    CONSTRAINT FK_from_Foo_to_FooType FOREIGN KEY (FooTypeCode)
        REFERENCES FooType (FooTypeCode)
);

CREATE TABLE BarType -- Look-up table.
(
    BarTypeCode CHAR(1)  NOT NULL,  
    Description CHAR(90) NOT NULL,  
    CONSTRAINT PK_BarType             PRIMARY KEY (BarTypeCode),
    CONSTRAINT AK_BarType_Description UNIQUE      (Description)
);

CREATE TABLE Bar -- Subtype of ‘Foo’.
(
    BarId       INT     NOT NULL, -- PK and FK.
    BarTypeCode CHAR(1) NOT NULL, -- Discriminator column. 
    E           INT     NOT NULL, -- Column that applies to ‘A’ and ‘B’.
    CONSTRAINT PK_Bar             PRIMARY KEY (BarId),
    CONSTRAINT FK_from_Bar_to_Foo FOREIGN KEY (BarId)
        REFERENCES Foo (FooId),
    CONSTRAINT FK_from_Bar_to_BarType FOREIGN KEY (BarTypeCode)
        REFERENCES BarType (BarTypeCode)    
);

CREATE TABLE A -- Subtype of ‘Bar’.
(
    AId INT NOT NULL, -- PK and FK.
    X   INT NOT NULL, -- Particular column.  
    CONSTRAINT PK_A             PRIMARY KEY (AId),
    CONSTRAINT FK_from_A_to_Bar FOREIGN KEY (AId)
        REFERENCES Bar (BarId)  
);

CREATE TABLE B -- (1) Subtype of ‘Bar’ and (2) supertype of ‘A’ and ‘B’.
(
    BId INT NOT NULL, -- PK and FK.
    Y   INT NOT NULL, -- Particular column.  
    CONSTRAINT PK_B             PRIMARY KEY (BId),
    CONSTRAINT FK_from_B_to_Bar FOREIGN KEY (BId)
        REFERENCES Bar (BarId)  
);

CREATE TABLE C -- Subtype of ‘Foo’.
(
    CId INT NOT NULL, -- PK and FK.
    Z   INT NOT NULL, -- Particular column.  
    CONSTRAINT PK_C             PRIMARY KEY (CId),
    CONSTRAINT FK_from_C_to_Foo FOREIGN KEY (FooId)
        REFERENCES Foo (FooId)  
);

이 구조를 사용하면 기본 테이블 (또는 relations ) 에 NULL 마크를 저장하지 않아도되므로 데이터베이스에 모호함이 생길 수 있습니다.

무결성, 일관성 및 기타 고려 사항

데이터베이스를 구현 한 후에는 (a) 각 배타적 슈퍼 타입 행이 항상 해당하는 서브 타입 대응 항목으로 보완되고 (b) 해당 서브 타입 행이 슈퍼 타입 판별 자 열에 포함 된 값과 호환되는지 확인해야합니다. . 따라서 TRANSACTIONS이러한 조건이 데이터베이스에서 충족되도록 ACID를 사용하는 것이 매우 편리 합니다.

데이터베이스의 논리적 건전성, 자기 표현성 및 정확성을 포기해서는 안됩니다. 이는 데이터베이스를보다 견고하게 만드는 측면입니다.

이전에 게시 된 두 가지 답변에는 데이터베이스 및 해당 응용 프로그램을 디자인, 작성 및 관리 할 때 고려해야 할 관련 사항이 이미 포함되어 있습니다.

VIEW 정의를 통한 데이터 검색

다른 supertype-subtype 그룹 의 열 을 결합 하는 일부 뷰를 설정하여 매번 필요한 JOIN 절을 작성하지 않고도 데이터를 검색 할 수 있습니다. 이러한 방식 으로 관심 있는 VIEW ( 파생 관계 또는 테이블 ) 에서 직접 쉽게 선택할 수 있습니다 .

보시다시피“테드”코드는 의심 할 여지없이 천재였습니다. 그가 맡은 도구는 매우 강력하고 우아하며 물론 서로 잘 통합되어 있습니다.

관련 자료

수퍼 타입-서브 타입 관계가 포함 된 광범위한 데이터베이스를 분석하려는 경우 @PerformanceDBA 에서 다음 스택 오버 플로우 질문에 제안한 특별한 답변 을 소중히 찾을 수 있습니다 .


노트

1. 정보 모델링 통합 정의 ( IDEF1X )는 1993 년 12 월 미국 표준 기술 연구소 ( NIST ) 에서 표준 으로 확립 한 권장 데이터 모델링 기법입니다 . 그것은 단단하게 기반으로 (a)는 초기 이론적 인 물질이 박사 EF 커드에 의해 작성된; 의 (b) 개체 - 관계 에 의해 개발 된 데이터의 뷰 박사 PP 첸 ; 또한 (c) Robert G. Brown이 만든 논리적 데이터베이스 디자인 기법. IDEF1X가 1 차 로직으로 공식화되었다는 점은 주목할 가치가 있습니다.


고용주가 비즈니스 로직을 바꾸어 E완전히 제거 했습니다! 사용자 srutzky 의 답변 을 수락하는 이유 는 가장 효율적인 경로를 결정하는 데 도움이되는 좋은 포인트를 제공하기 때문입니다. 그렇지 않다면 나는 당신의 대답을 받아 들일 것입니다. 나는 당신의 대답을 일찍 upvoted했습니다. 다시 감사합니다!
AlwaysLearningNewStuff 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.