2010-04-17 6 views
2

내 데이터베이스에 다양한 유형의 사용자를 저장하는 가장 좋은 방법이 궁금합니다.데이터베이스에 사용자 저장

저는 4 개의 주요 사용자 유형 (관리자, 학교, 교사, 학생)이있는 응용 프로그램을 작성하고 있습니다. 현재 각 테이블을 가지고 있지만 사용자 정보를 저장하는 가장 좋은 방법은 아닌지 잘 모르겠습니다.

예를 들어 학생들이 다른 학생에게 PM을 허용하는 것은 간단하지만 (발신자 및 수신자 student_id 저장) 교사에게 PM 학생을 허용하려면 다른 테이블 (보낸 사람 teacher_id, 보낸 사람 student_id)이 필요합니다.

모든 사용자를 user_type 필드가있는 하나의 사용자 테이블에 저장해야합니까? 그렇다면 교사/학생 관련 정보는 여전히 다른 테이블에 저장해야합니다. 나는 USER_TYPE이있는 사용자를 중지하려면 어떻게

users 
user_id, password_hash, user_type 

students 
user_id, student_specific_stuff... 

teachers 
user_id, teacher_specific_stuff... 

는 = 실수되는 학생은 (둘 다 USER_ID을 가지고)

그냥 내가 전에 데이터베이스가 올바른 얻을 수 있는지 확인하려면 교사 테이블에 입력되는 나는 더 멀리 간다. 감사 ...

답변

0

사용자가 이러한 유형 중 하나 (또는 ​​하나만 포함)가되어야하는지 또는 0 개 또는 그 유형 중 하나 이상일 수 있는지 물어봐야합니다 ... 나중에 (적어도), 당신은 "역할"에서 "사용자"를 분리해야합니다.

그러나 이러한 질문과 기타 질문은 일반적으로 응용 프로그램의 글로벌 디자인 단계 (도메인 개체와 그 관계 정의)에서보다 잘 대답되고 DB에 매핑됩니다. 예를 들어 사용자가 하나 또는 여러 개의 역할이 첨부 된 엔티티 (사용자의 역할)가 있거나 관리자가 사용자의 하위 클래스 (Admin은 '사용자') 인 것으로 결정할 수 있습니다.

관계형 데이터베이스에서 클래스 상속의 일반적인 구현을 살펴볼 수도 있습니다 ('is a'모델링을 선택하지 않아도 OOP을 수행하지 않는 경우에도) possible alternatives이 표시됩니다. .. 보편적으로 올바른 접근법이 없다는 것을 보여줍니다.

1

데이터베이스의 클래스 계층 구조, 계층 당 테이블 전략 및 클래스 별 테이블 전략을 저장하는 두 가지 주요 전략이 있습니다. 당신이 제안한 것처럼 계층 구조 당 테이블에서 사용자 클래스를 구분할 수있는 열이 필요합니다.

정말 다르거 나 공통점이있는 대상을 다룰 때까지 모든 것이 중요합니다. 예를 들어 모든 종류의 사용자에게 적용되는 작업이 있습니까?

종종 주관적이지만 거의 모든 시간마다 계층 전략 당 표를 사용합니다. 모든 사용자를 쿼리하거나 사용자 테이블에 외래 키를 추가해야하는 경우가 자주 있습니다.

또한 계층 구조 당 표의 변형은 클래스에 대한 서브 테이블을 조인하는 것입니다 (예 : 교사 전용 컬럼 만 포함하는 교사 테이블을 추가하고 사용자 테이블과 조인을 사용할 수 있습니다.

+0

감사

role = id, role name, 

또는 MySQL을의 사용자 테이블과 같은 매트릭스 스타일의 허가 시스템 같은 간단한 될 수 있습니다. 나는 계층 전략에 갈 것이라고 생각한다. 나는 당신이 질문의 두 번째 부분에 답변 한 사람이 없다는 것을 알아 차렸습니다 ... 학생 클래스가 "추가 관리자 정보"테이블에 실수로 입력되는 것을 방지하기 위해 어떻게해야합니까? MySQL에서 확인할 수있는 방법이 있습니까, 아니면 내 웹 서비스에서 확인해야합니까? – EMcKenna

0

사용자에게는 2 개의 테이블 인 사용자 및 그룹이 있습니다.

교사 나 학생과 같은 특정 엔터티에 대한 특정 데이터를 작성하려면 모두 사용자 테이블에 사용자에게 외래 키가있는 별도의 테이블을 사용하십시오.

1

기본 users 테이블의 사용자 유형을 연결하는 user_type_id 열이 있어야합니다.그런 다음 사용자를 삽입 할 때 user_type에 올바른 값이 저장되어 있는지 확인하십시오.

여분의 데이터를 저장하려면 extra_information_id (또는 무엇인가)이라는 users 테이블에 열을 추가 할 수 있습니다. 그런 다음 student_informationteacher_information 테이블을 2 개 더 가질 수 있습니다. 사용자를 삽입/업데이트/선택하는 경우 user_type_id 열과 extra_information_id 열의 조합을 사용하여 특정 사용자에게 추가 정보로 사용할 2 개의 추가 정보 테이블을 결정할 수 있습니다.

0

ORM 용어를 사용하여, 나는 일반적으로 다음과 같은 방법으로 인증을 구현 :

user = id, user id/name, password, created datetime, updated datetime, last login datetime 

user has many roles 

이 & 사용자가 그래서 사용자가 교사 & 관리자, 또는 학생 & 교사가 될 수있는 역할 사이의 테이블을 조인 사용.

역할은 모든 답변들에 대한

role = id, name, can_write, can_read, etc... 
관련 문제