데이터베이스의 배타적 아크 란 무엇이며 ' 왜 나쁜가요?

개발자가 저지른 가장 일반적인 데이터베이스 설계 실수를 읽었습니다. Q & A on stackoverflow. 첫 번째 대답에는 배타적 아크에 대한 문구가있었습니다.

배타적 아크는 하나와 하나의 외래 키가있는 둘 이상의 외래 키로 테이블을 만드는 일반적인 실수입니다. 이들 중 하나만 널이 아닐 수 있습니다. 큰 실수. 한 가지는 데이터 무결성을 유지하는 것이 훨씬 더 어려워집니다. 결국, 참조 무결성이 있어도 두 개 이상의 외래 키가 설정되는 것을 막는 것은 없습니다 (복잡한 검사 제약에도 불구하고).

정말 동의합니다. “배타적 인 아크가 왜 나쁜지 이해하지 못합니다. 아마 나는 그것의 기본을 이해하지 못했습니다.” 배타적 아크에 대한 좋은 설명이 있나요?

답변

오래 전에 이해 한 한 배타적 arc a table에는 다른 테이블에 대한 외래 키인 열이 여러 개 포함되어 있지만 한 번에 하나만 설정할 수 있습니다 (실제 세계에서 따르는 도메인에 대한 논리적 제약으로 인해). 이 규칙은 데이터베이스에 적용 할 수 없으므로 이러한 외래 키 중 둘 이상의 값이있는 경우 손상된 레코드가 생성 될 수 있습니다.

예를 들어 보겠습니다. 회사가 추적하는 애플리케이션을 고려해보십시오. 상품을 배달하는 데 사용하는 트럭입니다. 트럭은 동시에 세 곳 중 한 곳에만있을 수 있습니다. 직원과 함께있을 수도 있고, 주차장에있을 수도 있고, 정비소에있을 수도 있습니다. 이것은 모델링 할 수 있습니다. Employee, ParkingGarage 및 MaintenanceShop 테이블을 참조하는 employeeId, parkingGarageId 및 maintenanceShopId가있는 Truck-table을 사용합니다. 이러한 필드 중 하나만 데이터베이스 수준에서 채워지는 규칙을 시행 할 방법이 없습니다. 잘못된 코드 또는 데이터베이스에 직접 액세스 할 수있는 사람은 두 개 또는 세 개의 필드가 채워진 레코드를 삽입 할 수 있으며 이는 데이터베이스의 데이터 손상에 해당합니다.

댓글

  • 가능한 세 가지 트럭 위치는 수퍼 클래스의 하위 클래스 인 "입니다. 트럭 위치 ". 하위 클래스가 상호 배타적 인 경우가 많이 있습니다. 문제는 관계형 테이블에서 클래스와 하위 클래스를 모델링하는 방법입니다.
  • 이 디자인을 사용하는 것이 정당한 경우가 있다는 데 동의합니다. 그러나 나는 또한이 패턴이 원래보다 많이 사용된다는 원래 게시물에 동의 할 수 있습니다. 매우 큰 단점도 있습니다 …
  • 체크 제약을 사용할 수 없습니까? 예 : alter table mytable add constraint myconstraint check ((col1 is not null and col2 is null and col3 is null) or (col1 is null and col2 is not null and col3 is null) or (col1 is null and col2 is null and col3 is not null)). 배타적 호는 ' 좋지 않지만 검사 제약 조건으로 적용 할 수 있습니다. 물론 FK 제약 조건도 있어야합니다.
  • 따라서 게시물의 " 복잡한 검사 제약 조건에도 불구하고 " 위에 인용. 검사 제약 조건이나 도대체 심지어 트리거를 사용하여 정말 정교한 유효성 검사를 수행 할 수 있습니다. '이를 좋은 아이디어 나 좋은 디자인의 토큰으로 만들지 않습니다. 4 개 또는 5 개의 열이있는 배타적 호에 대한 검사 제약 조건을 수행한다고 상상해보십시오. 또한 ' 모든 데이터베이스 엔진이 아님을 상당히 확신합니다. CHECK 제약 조건을 지원합니다 . MySQL은 문서에서 CHECK 절이 파싱되었지만 무시되었다고 명시합니다 …
  • 이 소스 는 독점적 인 arc를 권장합니다. 생각이 있으십니까?

답변

독점 호에는 나쁜 것이 없습니다. 체크 제약 조건을 사용하여 해당 비즈니스 규칙을 적용하기 만하면됩니다. 대부분의 주요 데이터베이스 관리 시스템은 검사 제약 (Oracle, SQL Server, PostgreSQL)을 지원합니다. 데이터 모델링 도구를 사용하는 경우 도구가 검사 제약 조건을 구현하는 코드를 자동으로 생성 할 가능성이 있습니다.

답변

독점적 인 호는 개념적 또는 논리적 설계에서 매우 유용합니다. 그렇게 구현해야한다는 의미는 아닙니다. 앞의 예에서 설계자는 세 개의 테이블로 설계를 구현하기로 결정할 수 있습니다. 하나는 주차 용입니다. 하나는 직원 용이고 다른 하나는 유지 보수 용입니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다