2012-02-16 3 views
0

사용자 및 사용자 역할을 포함하는 스키마 디자인에 대해 생각하고 있지만 더 나은 경로가 무엇인지 확신 할 수 없습니다.사용자 역할 DB 스키마 디자인

1 세 개의 테이블, 사용자 정보를 하나의 역할 정보 하나, 그리고 번째 사용자의 역할과 관련하여 하나 만들기 옵션.

users { 
    u_id, 
    etc 
} 

roles { 
    r_id, 
    r_name, 
    etc 
} 

user_roles { 
    u_idm 
    r_id 
} 

이 두 테이블, 사용자 정보 하나 및 역할, 롤 정보 및 관련 정보와 다른 옵션 만들기.

users { 
    u_id, 
    etc 
} 

roles { 
    r_id, 
    u_id, 
    r_name, 
    etc 
} 

옵션 1은 견고하지만 추가 조인이 필요합니다. 옵션 2는 추가 기본 키가 필요하지만 하나의 조인 만됩니다. 역할 이름을 변경하면 옵션을 사용하여 업데이트하는 데 시간이 오래 걸릴 수 있지만 업데이트가 자주 발생하지는 않습니다.

확장 성있는 솔루션의 경우 더 좋을까요? 내 실종에 대한 다른 통찰력은 무엇입니까? 이것은 mysql과 postgresql 솔루션을위한 것이다.

답변

1

옵션 1 한 명의 사용자 만 각 역할을 맡을 수 있다면 어떤 역할이 좋을까요? 등록 된 사용자가 100 명인 경우 "등록 된 사용자"에 대해 100 개의 중복 정의가 있습니다.

"etc"가 많을수록 데이터베이스가 더 커집니다.

많은 중복을 사용하면 데이터베이스 속도가 느려지고 결국에는 하나의 조인이 더 적더라도 결국 느려질 것입니다.

많은 역할 기반 쿼리를 실행하고 옵션 2와 같은 데이터베이스가 필요하면 뷰를 만들고 데이터베이스 캐시를 만들 수 있지만이 방법이 유용 할 것입니다.

0

나는 몇 가지 변경 사항으로 첫 번째 옵션과 함께 갈 것 : 정의

- each user can belong to ONLY ONE group 
- create a table defining privileges 
- each group has a list of privileges 

권한은 응용 프로그램의 다양한 모듈 또는 특정 기능에 매핑 할 수 있습니다.

솔루션은 간단하고 유연하며 빠릅니다. 권한 테이블과 그룹 테이블 모두 매우 작아야하므로 여분의 JOIN이 그다지 중대한 영향을 미치지 않습니다. 또한 인증 된 사용자 권한은 세션에 저장 될 수 있고 매번로드되지 않을 수 있습니다. 솔루션은 매우 유연하고 확장하기 쉽기 때문에 장기적으로 더 많은 이점이 있습니다.

예를 들어 "구성"이라는 새 모듈을 만들고 "superadmin"이라는 새 사용자 그룹을 만들어 모든 곳과 "구성"에 액세스 할 수 있습니다. 당신은 단순히 데이터베이스에서 변경을 할 것입니다 : 그룹 'superadmin'을 만들고, 권한 '구성'을 추가하고, 모든 권한을 설정하면됩니다.

+0

하나의 그룹이 사이트 요구 사항에 맞지 않습니다. 사용자는 브랜드, 회원, 브랜드 관리자, 고객 등 또는 그 조합 일 수 있습니다. –