2010-03-09 2 views
1

나는 필드 정확히 하나의는 항상 NULL 비해야합니다 세 개의 필드, User, CityCountry와 테이블이있다. 이를 위해 SQL 제약 조건을 사용할 수 있습니까, 아니면 제가하고있는 일을 재고해야합니까?SQL Server 2008 : 제약 조건을 사용할 수 있습니까?

내 데이터베이스는 사용자, 도시 또는 국가에 연결할 수있는 문서를 포함해야합니다. 따라서이 표의 행에는 사용자, 도시 또는 국가에 대한 하나의 문서 만 포함되어 있습니다. 그러나, "첨부 된"엔티티에 상관없이 모든 문서를 검색 할 수 있어야합니다.

내가 세 개의 다른 테이블을 사용하지 않는 이유는 세 곳의 모든 위치에서 문서를 검색 할 때 세 개의 테이블을 JOIN하는 것을 피고 싶기 때문입니다. 나는 여기서 사용하려고하는 비정규 화의 종류가 성능을 향상시킬 것이라고 생각하지만 확실하지 않습니다.

생각하십니까?

+0

당신이 모두를 알고있는 경우, 사용자와 문서에 대한 CITY? 귀하의 조항은 ** 적어도 하나의 필드는 null이 아니어야 ** **? –

+0

@Raj : 아니요.이 시스템에서는 문서가 이상하게 들리더라도이 세 가지 중 하나에 만 첨부 할 수 있습니다. :) –

답변

1

내가 제대로 이해한다면, 다음과 같은 SQL은 당신이 찾고있는 제약 조건을 추가해야합니다 :

ALTER TABLE YourTableName 
ADD CONSTRAINT CK_TestNullCount 
    CHECK (Case When [user] is NULL Then 0 Else 1 End 
      + Case When City Is NULL Then 0 Else 1 End 
      + Case When Country Is NULL Then 0 Else 1 End = 1) 
0

LocationID, LocationName 및 (필요한 경우) LocationType (User, City, Country)이있는 단일 테이블 위치에 두십시오. 문서의 "위치"를 발견하려면 단일 조인 만 있으면되고 위치의 이름을 가져올 필드를 선택할 필요가 없습니다.

이 기술을 사용하면 간단한 null이 아닌 외래 키 제약 조건을 사용하여 "유일한 위치"요구 사항을 적용 할 수 있습니다.

-1

두 개의 열이 있는데, 하나는 LocationId이고 다른 하나는 LocationTypeId입니다. 그런 다음 세 가지 테이블에 조인 남아 있습니다 : 당신이 체크 제약과 그것을 할 수

SELECT COALESCE(User.Name, City.Name, Country.Name) 
FROM Location 
INNER JOIN LocationType ON Location.LocationTypeId = LocationType.LocationTypeId 
LEFT JOIN User ON Location.LocationId = User.Id AND Location.LocationTypeId = 1 
LEFT JOIN City ON Location.LocationId = City.Id AND Location.LocationTypeId = 2 
LEFT JOIN Country ON Location.LocationId = Country.Id AND Location.LocationTypeId = 3 
+0

이것은 데이터를 선택하는 것이 아니라 데이터베이스에서 데이터 무결성을 보장하는 것입니다. – HLGEM

+0

OP는 그가 3 개의 기둥을 가지고 있으며 그가 단 하나만 사용했음을 확인했다. LocationId (세 개의 열 모두를 대체하는)라는 단일 열을 가짐으로써이를 보장합니다. – openshac

0

확실하지 않음 경우 - 나는 주위를 연주 해요하지만 아무것도 정말

:-(결국 일 것 같다

그러나 테이블에 INSTEAD OF INSERT (가능하면 INSTEAD OF UPDATE) 트리거를 생성하여 이러한 조건을 확인할 수 있으며, 조건이 충족되지 않으면 RAISERROR를 사용하여 예외를 throw하면 행이 삽입 (또는 업데이트)되지 않습니다.

0

나는 FK 시나리오를 고수 할 것을 제안합니다. 문안은 하나에 묶여 있고 오직 하나만 DocumentType (붙어있는 전화).

매우 단순한 관계입니다. Document 테이블에 이미 3 개의 열이 있지만, FK를 만드는 것이 좋습니다. alt text

그런 다음 유효 값 범위의 문서 유형을로드하십시오. 데이터를 삽입 할 때

alt text

, 당신은 오히려 INT보다는 VARCHAR로 유형을 작성됩니다. 이것은 perf 문제를 일으키지 않아야하며, 비정규 화 된 스키마와 함께보고 등에서 도움이 될 것입니다.

alt text

관련 문제