2009-04-05 3 views
1

우선,이 질문의 피드백 특성에 대해 유감스럽게 생각합니다. 내가 할 수있는만큼 그것을 일반화하려고 노력하고 있지만, 다른 사람들도 그걸 얻을 수있다. 그러나 나는이 디자인에 대한 피드백을 줄 사람이 정말로 없다. 그래서 너희들이 나를 도울 수 있기를 바랐다.관계형 데이터베이스에서 다른 사용자 유형 모델링

그런 말로는 내 데이터베이스에서 다른 사용자 유형을 모델링하지 않아도됩니다. 나는 usertypes에 대한 자격 증명을 공유하고 싶습니다. 이 문제는 기본적으로 RDB가 잘 수행하지 못하는 상속에 관한 것입니다. DB design http://img48.imageshack.us/img48/9196/dbdesign.png

을 ..하지만 난 그것으로 만족하는 경우는 내가 확실 해요 :

나는 그러나이 디자인을 마련했다. 내가 그것에 대해 좋아하지 않는 것은 그것에있는 사업 계약의 양입니다. 우선, 어떤 사용자 유형이 주어진 신임장에 속해 있는지 알지 못합니다. 즉, 잠재적으로 N 개의 테이블을 검색해야하며, N은 내가 가진 usertypes의 수입니다. 따라서 사용자 유형을 해당 역할과 연결하는 방법을 생각했습니다. 따라서 자격 정보 A를 가진 사용자가 "UserType1"및 "UserType2"역할을 가지고 있으면 UserType1에 ​​Tuggle이 있어야하고 그 또는 그녀를 나타내는 UserType2 테이블. -이 "비즈니스 논리"가 필요한지 잘 모르겠다 고 생각합니다. :)

이 디자인에 대한 피드백은 다른 디자인과 마찬가지로 매우 만족 스러울 것입니다. 이 OO의 추상 클래스와 유사 있다면 당신은 부모의 판별 자 컬럼을 넣을 수 있습니다 사전

답변

4

감사합니다. discriminator는 각 하위 유형마다 다른 값을 갖습니다. 당신이 똑똑하다면, 그것은 하나의 행마다 자식 유형별 테이블이있는 fk입니다.

또는 usertype1에 ​​대한 authcredentials 조인이 다른 usertype1에는 성공하지만 다른 자식 유형에는없고 다른 테이블에 대해서도 마찬가지로 성공할 수 있습니다. 각 하위 테이블에 대한 왼쪽 외부 조인에서 유형이 아닌 모든 컬럼 (특히 ID)은 널 (null)이며, ID는 널 (NULL)이 아닙니다. 그런 다음 다음을 기반으로 계산 된 열을 추가 할 수 있습니다.

select 
a.*, b.*, c.*, 
case when b.id is not null then 1 else 0 end as is_usertype1, 
case when c.id is not null then 1 else 0 end as is_usertype2, 
from authcredentials a 
left outer join usertype1 b on (a.id = b.authcredential_id) 
left outer join usertype2 c on (a.id = c.authcredential_id); 

그런 다음 쉽게 사용할 수 있도록보기를 선택하십시오. 인서트는 여전히 별도의 테이블 usertype 및 usertype2에 있지만, OO 프로그래밍에서는 ctors가 상속되지 않으며 공통 기반의 두 하위 클래스가 반드시 ctors를 가질 필요는 없습니다.

기본 클래스가 파생 클래스보다 먼저 생성되는 C++에서와 마찬가지로 자식 행을 만들 수 있기 전에 부모 행을 만들어야합니다 (FK가 필요함).

postgresql은 이와 같이 테이블 상속을 명시 적으로 지원합니다. Hibernate ORM은 테이블을 자바 서브 클래스에 매핑하는 것을 지원한다.

관련 문제