2010-04-14 6 views
0

특정 시스템에 로그인 할 수 있어야하는 여러 유형의 사용자를 재현하는 여러 엔티티가 있습니다. 또한, 그들은 그들과 관련된 여러 가지 유형의 정보를 가지고 있습니다.이 일대일 관계를 모델링하는 방법은 무엇입니까?

예 : 전자 메일 주소가있는 "일반 사용자"와 워크 스테이션 번호가있는 "관리자 사용자"(가상의 경우에주의하십시오). 두 주체는 이름, 성, 주소 및 전화 번호와 같은 공통 속성도 공유합니다. 마지막으로 로그인 할 때 고유 한 사용자 이름과 암호가 필요합니다.

응용 프로그램에서 사용자는 사용자 이름과 암호를 입력하기 만하면 응용 프로그램의 기능이 약간 변경됩니다 사용자 유형 이 작품에서 사용자 이름이 고유해야한다고 생각할 수 있습니다.

어떻게 효과적으로 모델링해야합니까?

두 개의 테이블을 만들 수는 없습니다. 사용자 이름에 고유 한 constaint를 적용 할 수 없기 때문입니다.

서로 다른 유형의 특정 정보를 가지고 있기 때문에 하나의 테이블에 모두 넣을 수도 없습니다.

"사용자"(사용자 이름 및 암호 사용), "일반 사용자"및 "관리 사용자"에 대해 하나씩 3 개의 개별 테이블이 필요하다고 생각하지만 이들 간의 관계는 어떻게 될까요? 작업? 아니면 다른 해결책이 있습니까?

(그런데 대상 DBMS는 MySQL이므로 데이터베이스 시스템 자체에서 일반화가 지원되지 않는다고 생각합니다.)

답변

0

귀하의 3 테이블 접근 방식이 좋아 보인다. 사용자 테이블에는 ID, 사용자 이름, 암호, 사용자 유형 만 있습니다. 일반 사용자 테이블에는 ID, UserID (사용자 테이블로부터), 다른 필드가 있습니다. 관리자 사용자에게도 마찬가지입니다.

사용자 유형 필드는 추가 정보를 검색 할 어떤 테이블에서 당신을 말할 것이다

if(usertype==admin) 
    select * from admins where userid=:id; 
else  
    select * from general where userid=:id; 
+0

이 방법이 좋습니다. 하나의 쿼리에서 2 개의 관련 테이블에서 정보를 얻는 방법이 있을지, 아니면 처음에는 쿼리로 제한 한 다음 if와 다른 쿼리 (아무 문제가 없지만 궁금 해서요)입니다. – pbean

+0

서로 다른 테이블에 다른 필드가 있다고 말하면 단일 쿼리를 작성하기가 어렵습니다. 그리고 나는 당신이 하나의보기에서 두 usertypes의 정보를 또한 보여줄 것이라고 생각하지 않습니다 - 그래서 그들을 결합 할 필요가 없습니다. – Riho

0

두 개의 테이블. 사용자 이름, 처음, 마지막 등등이있는 사용자. 역할이있는 역할과 사용자 이름 (또는 사용자 ID 등)으로 연결되는 링크. 사용자 이름에 고유 한 제한 조건을 지정하십시오. 워크 스테이션 nbr, 이메일, 전화, 기타 필요한 것을 사용자 테이블에 입력하십시오. ROLES 테이블 (USERID와 ROLE)에 2 개의 컬럼을 넣는다.

0

당신은 (미래에 저장 또는 가능성) 저장되는 얼마나 많은 특정 정보를 결정하고 기반으로 결정을 내려야한다 그. 각 사용자 유형에 대해 소수의 필드 만있는 경우 단일 테이블을 사용하는 것이 좋습니다.

USERS 테이블 (이름, 유형, 이메일, 비밀번호, genfield1, genfield2, adminfield1, adminfield2)

하는 유형 (즉, 사용자에게 특정 일부 필드가 채워 때문에 가정하지 마십시오 포함해야합니다 사용자가 해당 유형 임) 필드. 모든 쿼리는 "AND usertype ="절을 포함하면됩니다.

각 유형과 관련된 필드 나 규칙이 많은 경우 세 가지 테이블 아이디어가 가장 좋습니다.

USERS 테이블 (ID, 유형, 이름, 암호)
GENUSERS (ID, genfield1, genfield2)
ADMINUSERS (ID, adminfield1, adminfield2) 테이블에 ID 사이에

제약은 당신이 필요로하는 모든입니다 (그리고 주요 USERS 테이블은 ID를 고유하게 유지합니다). 대부분의 상황에서 잘 작동하지만 특정 필드가있는 두 유형의 사용자가 모두 포함 된 보고서는 두 부분으로 이루어져야합니다 (통합 SQL 또는 하위 쿼리 또는 여러 개의 왼쪽 조인).

0

모든 사용자가 사용할 수있는 정보와 모든 특정 사용자 유형에 대해 1 개의 테이블을 포함하는 '일반'사용자 테이블로 해결할 수 있습니다. 당신의 예제에서는 3 개의 테이블이 필요할 것입니다.

사용자 :이 테이블에는 모든 사용자 유형 즉, 사용자 이름, 주소 등

일반 사용자 :이 테이블은 사용자 테이블을 참조하는 foreing 키 UserId를 제공하여 Users 테이블을 '확장'합니다. 또한 일반 사용자에 대한 정보가 여기 fx에서 열립니다. 이메일 주소 등

AdminUsers : 일반 사용자와 마찬가지로이 테이블은 Users 테이블을 참조하는 UserId 외래 키를 제공하여 Users 테이블도 '확장'합니다. 여기에는 관리자 사용자 정보가 있습니다. WorkstationId 등

외래 키 참조를 사용하여 Users 테이블을 '확장하는'새 테이블을 추가하기 만하면 '전문화'를 추가 할 수 있습니다. 또한 여러 수준의 전문화를 생성 할 수 있습니다. 예를 들어 관리자 사용자가 일반 사용자와 일반 사용자 인 경우 AdminUsers는 Users 대신 GeneralUsers를 일반 사용자에게 단순히 사용하지 않고 GeneralUsers를 '확장'할 수 있습니다.

이 모델의 데이터를 가져와야하는 경우 쿼리 할 사용자 유형이 필요합니다. 관리자 사용자

쿼리

또는 경우 GeneralUsers.UserId = Users.UserId

ON LEFT 사용자를 가입 GeneralUsers FROM

SELECT * : 예를 들어 당신이 GeneralUser를 조회해야하는 경우 다음과 유사한 뭔가가 필요합니다 SELECT * FROM AdminUsers LEFT JOIN 사용자 ON AdminUsers.UserId = Users.UserId

추가 수준의 전문화가있는 경우, 예를 들어 관리자 사용자도 일반 사용자로 지정하여 방금 참여할 수 있습니다.

SELECT * FROM AdminUsers LEFT는 GeneralUsers.UsersId = Users.UserId

+0

이것은 Riho의 제안 된 접근법과 유사합니다. 나는 그것에 대해 하나의 질문이 있습니다. "Users"테이블의 모든 사용자 ID는 고유하므로 "GeneralUsers"및 "AdminUsers"테이블에서 동일한 ID를 사용하는 것이 좋습니다 (" User Id "? – pbean

0

내가 가장 확실히 당신은 별도의 테이블이 모델을 할 것이다 사용자를 가입 AdminUsers.UserId = GeneralUsers.UserId 왼쪽에 GeneralUsers 가입 일반 사용자, AdminUser 및 ReadOnlyUser.

데이터베이스 디자인에서, 좋은 어림짐작은 "아래로 뛰는"이다. 여러 테이블 (각 유형에 하나씩) 대신 SystemUsers 테이블과 역할 테이블을 만들고 SystemUsers를 역할에 넣기위한 조인 테이블을 정의합니다. 또한 개별 역할을 정의 할 것입니다.

이렇게하면 여러 역할에 사용자를 추가하거나 제거 할 수 있습니다.

역할에 여러 권한이있을 수 있으며,이 권한은 언제든지 수정할 수 있습니다.

다른 곳으로 조인하려면 GeneralUserId, AdminUserId 및 ReadOnlyUserId 열 (SystemUserId 열)이 필요하지 않습니다.

이것은 ASP.Net 역할 기반 보안 모델과 매우 유사합니다.

alt text http://img52.imageshack.us/img52/2861/rolebasedsecurity.jpg

+0

통찰력을 가져 주셔서 감사합니다. 그러나 보안 모델의 실제 구현보다 일반화와 일대일 관계에 대한 질문이 많습니다. :) – pbean

+0

@pbean : answer edited. –

관련 문제