2012-06-22 2 views
1

사용자 및 관련 프로필로 시나리오를 모델화해야합니다.사용자 및 프로필 시나리오 모델 작성 방법

요구 사항 : 사용자가 필수 개인 프로필 (ProfileA와)가 있어야합니다

또한 사용자 선택적으로는 비즈니스 프로파일 (ProfileB를)을 가질 수있다.

사용자는 프로필 유형당 하나의 프로필 만 연결해야합니다. 당신은 또한 저와 함께 공유하시기 바랍니다 대안 모델링 솔루션이있는 경우

다음은 데이터베이스 설계에 대한 내 생각은, 내가 특별히 아이디어 B.

에서 null 허용 FK의 사용에 대한 귀하의 의견과 생각을 가지고 싶어요. 미리 감사드립니다.

IDEA의 A : (null 허용 FK 사용)

Users 
------------------ 
UserID PK 

ProfilesA 
------------------ 
UserID PK FK 

ProfilesB 
------------------ 
UserID PK FK 

IDEA의 B :

Users 
------------------ 
UserID  PK 
ProfileAId NULL FK 
ProfileBId NULL FK 

ProfilesA 
------------------ 
ProfileAId PK 

ProfilesB 
------------------ 
ProfileBId PK FK 

답변

1

는 IDEAProfileA의 존재를 적용하지 않을 것이다. User.ProfileAId 가정가 할 수

IDEA의 B는 NULL NOT이지만, 이것은 단지 (MS SQL Server에서 지원되지 않음) 이연 제약 thrugh 해결 될 수 원형 FKS을 소개합니다. 이 외에도 다른 사용자가 동일한 색인을 필요로하고 다른 색인을 추가해야하는 경우 (특히 clustering을 사용하려는 경우) 새로운 색인에 일정한 오버 헤드가 발생할 수 있으므로 다른 사용자가 에 UNIQUE 제약 조건을 설정해야합니다.


우리가 다루고 있기 때문에 "1 : 1"(User : ProfileA)와 "1 : 0 또는 1"(User : ProfileB) 관계, 나는 아마 같은 테이블에 모든 것을 넣어 줄 다음 NULL이 아닌 NULL을 사용하려면 ProfileA과 을 허용하십시오.

User 
------------------ 
UserID PK 

ProfileARequiredField1 NOT NULL 
ProfileARequiredField2 NOT NULL 
ProfileARequiredField3 NOT NULL (...) 
ProfileAOptionalField1 NULL 
ProfileAOptionalField2 NULL 
ProfileAOptionalField3 NULL (...) 

ProfileBRequiredField1 NULL 
ProfileBRequiredField2 NULL 
ProfileBRequiredField3 NULL (...) 
ProfileBOptionalField1 NULL 
ProfileBOptionalField2 NULL 
ProfileBOptionalField3 NULL (...) 

-- For ProfileB, if one required field is present, all must be present, 
-- and optional fields are allowed only if required ones are present. 
CHECK (
    (
     ProfileBRequiredField1 IS NULL AND 
     ProfileBRequiredField2 IS NULL AND 
     ProfileBRequiredField3 IS NULL AND 
     ProfileBOptionalField1 IS NULL AND 
     ProfileBOptionalField2 IS NULL AND 
     ProfileBOptionalField3 IS NULL 
    ) 
    OR (
     ProfileBRequiredField1 IS NOT NULL AND 
     ProfileBRequiredField2 IS NOT NULL AND 
     ProfileBRequiredField3 IS NOT NULL 
    ) 
) 

는 다른 방법으로, UserProfileA 필드를 유지하지만, 이미 (IDEA의 B의 합병증에 대한 필요가 없습니다) IDEA A를 에서처럼, 별도의 테이블에 ProfileB 필드를 이동합니다. 그러나 NULL 저장소는 저렴하며 filtered indexes을 사용하여 인덱스에서 NULL을 제외 할 수 있으므로 가치가 없습니다.

+0

감사의 뜻 Brank에게 감사의 말씀을드립니다. – GibboK

+0

지연된 무결성 제약에 대한 참조로이 링크를 추가하기 만하면됩니다. http://www.databasedesign-resource.com/deferred-integrity-constraints.html – GibboK

관련 문제