P粉4764755512023-08-30 12:45:43
세 번째 옵션은 "Policy" 테이블을 만든 다음 "SectionsMain" 테이블을 만들어 다양한 유형의 섹션에 공통된 모든 필드를 저장하는 것입니다. 그런 다음 일반적이지 않은 필드만 포함하는 각 섹션 유형에 대한 추가 테이블을 만듭니다.
어느 것이 가장 좋은지 결정하는 것은 주로 필드 수와 SQL 작성 방법에 따라 달라집니다. 그들은 모두 작동할 것입니다. 필드가 몇 개만 있는 경우 아마도 #1을 선택하겠습니다. "많은" 영역에 대해서는 #2나 #3을 선호합니다.
P粉7225212042023-08-30 11:57:12
@Bill Karwin 그의 SQL Antipatterns 책에서 그는 SQL Entity Property Values 안티 패턴을 제안합니다. 간략한 개요는 다음과 같습니다.
첫 번째 옵션처럼 단일 테이블을 사용하는 것이 아마도 가장 간단한 디자인일 것입니다. 앞서 언급한 것처럼 많은 하위 유형별 속성에는 해당 속성이 적용되지 않는 행에 NULL 값을 주어야 합니다. 이 모델을 사용하면 다음과 같은 전략 테이블이 생성됩니다.
으아악디자인을 단순하게 유지하는 것이 장점이지만 이 접근 방식의 주요 문제점은 다음과 같습니다.
새 하위 유형을 추가할 때 이러한 새 개체를 설명하는 속성을 수용하도록 테이블을 변경해야 합니다. 이는 하위 유형이 많거나 하위 유형을 정기적으로 추가하려는 경우 빠르게 문제가 될 수 있습니다.
어떤 속성이 어떤 하위 유형에 속하는지 정의하는 메타데이터가 없기 때문에 데이터베이스는 어떤 속성이 적용되고 어떤 속성이 적용되지 않는지 강제할 수 없습니다.
적용해야 하는 하위 유형 속성에는 NOT NULL
도 적용할 수 없습니다. 이를 애플리케이션에서 처리해야 하는데 이는 일반적으로 이상적이지 않습니다.
상속 문제를 해결하는 또 다른 방법은 각 하위 유형에 대해 새 테이블을 만들고 각 테이블의 모든 공통 속성을 반복하는 것입니다. 예:
으아악이 디자인은 기본적으로 단일 테이블 접근 방식으로 식별된 문제를 해결합니다.
이제 NOT NULL
를 통해 필수 속성을 적용할 수 있습니다.
새 하위 유형을 추가하려면 기존 테이블에 열을 추가하는 것이 아니라 새 테이블을 추가해야 합니다.
속성 정책의 vehicle_reg_no
필드와 같이 특정 하위 유형에 부적절한 속성을 설정할 위험도 없습니다.
단일 테이블 방식처럼 type
속성이 필요하지 않습니다. 이제 유형은 메타데이터: 테이블 이름으로 정의됩니다.
그러나 이 모델에는 몇 가지 단점도 있습니다.
공용 자산은 하위 유형별 속성과 혼합되어 있으며 이를 식별하는 쉬운 방법이 없습니다. 데이터베이스도 모릅니다.
테이블을 정의할 때 각 하위 유형 테이블에 대한 공통 속성을 반복해야 합니다. 이건 절대 dry가 아닙니다.
하위 장르에 관계없이 모든 전략을 검색하는 것은 어려워지고 많은 노력이 필요합니다 UNION
.
유형에 관계없이 다음을 통해 모든 전략을 쿼리해야 합니다.
으아악새 하위 유형을 추가하려면 각 하위 유형에 대한 추가 UNION ALL
를 사용하여 위 쿼리를 수정해야 합니다. 이 작업을 잊어버리면 응용 프로그램에서 쉽게 오류가 발생할 수 있습니다.
이것은 @David가 다른 답변 에서 언급한 솔루션입니다. 모든 공용 속성을 포함하는 기본 클래스에 대한 테이블을 만듭니다. 그런 다음 기본 키가 기본 테이블 역할도 하는 각 하위 유형에 대한 특정 테이블을 생성합니다. 예:
으아악이 솔루션은 다른 두 디자인에서 발견된 문제를 해결합니다.
필수 속성은 NOT NULL
을 통해 적용할 수 있습니다.
새 하위 유형을 추가하려면 기존 테이블에 열을 추가하는 것이 아니라 새 테이블을 추가해야 합니다.
특정 하위 유형에 부적절한 속성을 설정할 위험이 없습니다.
type
속성이 필요하지 않습니다.
이제 공용 속성은 더 이상 하위 유형별 속성과 혼합되지 않습니다.
드디어 건조한 상태를 유지할 수 있게 되었습니다. 테이블 생성에는 각 하위 유형 테이블에 대한 공통 속성의 중복이 필요하지 않습니다.
정책 자동 증가 관리 id
가 독립적으로 생성되는 각 하위 유형 테이블이 아닌 기본 테이블에서 처리할 수 있으므로 더 쉬워집니다.
하위 유형에 관계없이 모든 전략을 검색하는 것이 이제 매우 쉽습니다. 필요하지 않습니다 UNION
- 只需 SELECT * FROM 策略
.
대부분의 경우에는 테이블 형식의 접근 방식이 가장 적합하다고 생각합니다.
이 세 가지 모델의 이름은 Martin Fowler책 Enterprise Application Architecture Patterns에서 따왔습니다.