2011-02-18 7 views
3

사용자 및 그룹 : 엔티티가 2 개 있습니다. 가장 쉬운 모델은 user (id, name, etc ...), group (id, name), user_group_rel (user_id, group_id)입니다. 그러나 다른 그룹에 그룹을 포함시켜야합니다. 한 사용자는 많은 그룹에 속할 수 있으며 그룹에는 자신의 사용자 및 하위 그룹이있는 사용자 및 하위 그룹이 포함될 수 있습니다! 데이터베이스 모델에 대한 도움이 필요합니다.데이터베이스 사용자 및 그룹 모델

Users and groups

답변

4

나는 Ken Down의 명명법에 동의하지만, 사용자와 역할이 동일한 엔티티임을 반드시 동의하지는 않습니다.

자료 엔티티 :

Users  (user_id, user name, real name, user_status, etc) 
Role  (role_id, role name, role_password, etc) 
Privilege (priv_id, base object, functionality, what have you) 

연관 기관 :

User has Role (0 - n) (user_id, role_id) 
Role has Role (0 - n) (role_id, has_role_id) 
User has Privilege (0 - n) (user_id, priv_id) 
Role has Privilege (0 - n) (role_id, priv_id) 
3

요즘이는 "역할"에 사용자 및 그룹을 모두 붕괴하여 수행됩니다. 당신이 가진 것은 역할이며, 다른 역할과 역할의 연결입니다. 일부 역할에는 "login"플래그가 true로 설정되어 유효 사용자가되고 "login"플래그가 설정되지 않은 역할은 그룹과 유사합니다.

주요 아이디어는 모든 것을 더 간단하게 만듭니다. 두 가지 별도의 개념이나 엔티티 (사용자 및 그룹)를 유지할 필요는 없지만 하나의 개념, 즉 역할 만 유지하면됩니다. 그런 다음 사용자에게 해당 "로그인"플래그를 사용합니다.

EDIT : @XIVSolutions에서 제공하는 첫 번째 옵션을 보면 테이블 구조에 대해 위에서 언급 한 내용을 자세히 설명합니다. 다른 역할에 하나의 역할을 두는 것에 대한 귀하의 질문에 대한 답변입니다. 두 번째 테이블 인 상호 참조는 역할과 상위를 나열합니다. 역할에 여러 상위 항목 (해당 테이블에 여러 항목이 있음)이 있으면 많은 그룹에서 한 명의 사용자를 갖는 것과 같습니다.

#DIT : @XIVSolutions 테이블 디자인 :이 세 번째 테이블은 사용자 (로그인)를 별도로 관리하는 엔티티로 완벽하게 합법적 인 방법입니다.

+0

확인. 그룹 또는 사용자를 여러 그룹에 포함시킬 수있는 방법은 무엇입니까? – VeroLom

+0

데이터베이스 모델링에 초보자이기 때문에 예제가 필요합니다. – VeroLom

+0

예를 들어, 다른 방법을 사용하는 것이 좋습니다. 구성하려는 특정 보안 담당자의 예제를 제공하도록 질문을 편집 한 다음 해결책에 맞는 답을 수정할 수 있습니다. –

2

재 : 켄 다운스 솔루션 :

나는 것,이 두 가지 버전의 연주 (및했습니다 목표에 부합하는지 여부를 듣고 사랑해.) :

옵션 1 :

**tblRole** 
RoleID PK 
RoleName 

**tblRoleIndex** 
ParentRoleID FK on tblRole 
ChildRoleID FK ON tblRole 

NOTE: ParentRoleID and ChildRoleID form a composite Primary key in the above table. 

**tblLogIns** 
LogInID PK 
RoleID 
PassWord 

또는 옵션 2 :

**tblRole** 
RoleID 
ParentRoleID Recursive FK on tblRole.RoleID 
RoleName 

NOTE: A top-level role in the table above has a default ParentRoleID of -1 or 0 

**tblLogIns** 
LogInID PK 
RoleID 
PassWord 
+0

나는 더 가까이서 보았다. 그것이 가치가있는 것을 위해, 아담의 해결책도 꽤 흥미 롭습니다, 그리고 아마 내 것보다 낫습니다. – XIVSolutions

+0

나는 속임수를 썼습니다. 오라클이 내부적으로 사용하는 사용자와 그룹을위한 모델입니다. 8-) –

+1

@ 아담 - 음, 그게 인생의 모든 것인가? 휠의 재발 명을 피하시겠습니까? ;-) – XIVSolutions

2

이 그룹의 구성원으로 모두 사용자와 그룹을 처리하는 방법입니다 모델링의 주요 난제. Ken Downs의 접근 방식은이 문제를 해결할 것입니다. 또 다른 방법은 공통 기본 형태의 파생 형태로서 사용자와 및 그룹을 치료하는 것이다

이러한 접근
create table groupmemberbase 
(
    memberid int, 
--optional flag to idicate the type of the derived entity 
--this is similar to the login flag used by Ken Downs 
    membertype int, 
    primary key (memberid) 
) 

create table users 
{ 
    memberid int, 
--more user attributes here 
    primary key (memberid), 
    foreign key (memberid) references groupmemberbase (memberid) 
) 

create table groups 
(
    memberid int, 
--more group attributes here 
    primary key (memberid), 
    foreign key (memberid) references groupmemberbase (memberid) 
) 

create table groupmembers 
(
    groupid int, 
    memberid int, 
    primary key (groupid, memberid), 
    foreign key (groupid) references groups (memberid) 
    foreign key (memberid) references groupmemberbase (memberid) 
) 

하나의 장점은 실수로 사용자의 부재가되는 사용자 또는 그룹을 방지한다는 것이다 - 이러한 제약 스키마 수준에서 적용됩니다.

+0

나는 이것 역시 좋아한다. 결코이 방법을 생각하지는 않았지만, 단순하고 깨끗하며 우아하게 보입니다. – XIVSolutions

관련 문제