2012-12-06 4 views
9

나는 사용자의 4 종류가 있고 각각은 특정 데이터를 가지고 있지만, 그들은 또한 COMMUN 데이터를 공유 user_type 칼럼 그런 다음 사용자 데이터를 쿼리 할 때 먼저 user_type을 선택한 다음 output에 따라 "사용자 유형"특정 데이터를 가져 오기 위해 다른 쿼리를 실행합니다. 나는 하나의 쿼리로 모든 사용자 관련 데이터를 가져올 수 있고 이상적으로는 외래 키를 사용할 수 있으면 좋겠다.관계형 데이터베이스 설계 여러 사용자 유형

두 번째 생각은 users 테이블의 user_type 열이 대신 특정 사용자 유형 테이블에서 행 주 users 테이블을 가리 것으로 외래 키를 사용하지 않는 것입니다. 나는 N 개의 쿼리를 실행해야 할 것 같지만, 사용자 데이터를 가져올 때마다 N이 사용자 유형의 수인 것이 더 좋을 것이라고 생각합니다.

다른 옵션이 있습니까? 그런 경우에 좋은 연습은 무엇입니까?

많은 감사

+0

내가 당신을 이해한다면

, 당신은 당신의 SQL 문에 가입 절을 사용해야합니다. 'SELECT * FROM users '와 같은 것 U LEFT JOIN user_details D ON U.id = D.user_id WHERE U.id =?' –

+0

사용자는 한 번에 둘 이상의 유형을 가질 수 있습니까? –

+0

@Catcall 아니오이 시나리오에서 사용자는 하나의 유형 만 가질 수 있습니다. 두 경우 모두 가능성이 궁금합니다. – silkAdmin

답변

14

사례는 클래스/하위 클래스의 인스턴스와 유사합니다.

SQL 테이블을 디자인하여 서브 클래스를 처리하는 두 가지 고전적인 방법이 있습니다. 각각에는 장단점이 있습니다.

편도를 "단일 테이블 상속"이라고합니다. 이 설계에는 모든 유형의 사용자에 대해 하나의 테이블 만 있습니다. 지정된 열이 주어진 행과 관련이없는 경우, 교차 부분은 NULL로 남습니다. 사용자 유형을 나타내는 열을 추가 할 수 있습니다.

또 다른 방법은 "클래스 테이블 상속"입니다. 이것은 Nanego가 준 답변과 비슷하지만 몇 가지 사소한 변화가 있습니다. 모든 공통 데이터와 ID 필드가있는 사용자 테이블이 하나 있습니다. 각 서브 클래스마다 하나의 테이블이 있으며, 해당 서브 클래스와 관련된 데이터가 있습니다. id 필드는 종종 사용자 테이블의 일치하는 행에있는 id 필드의 복사본으로 설정됩니다.이 방법으로 하위 클래스 키는 기본 키와 사용자 테이블을 참조하는 외래 키 모두로 작동하는 이중 의무를 수행 할 수 있습니다. 이 마지막 기술을 "공유 기본 키"라고합니다. 삽입 시간에 약간의 프로그래밍이 필요하지만, 그만한 가치가 있습니다. 관계의 일대일 특성을 강화하고 필요한 조인 속도를 높입니다.

이러한 디자인 중 세 가지를 모두 SO의 태그 또는 웹의 기사로 검색 할 수 있습니다.

+2

해당 용어를 삭제 해 주셔서 감사합니다. Google 검색 결과 이미 많은 것을 배웠습니다. – silkAdmin

0

그것을 할 내 방법은 일반 필드와 하나의 테이블 "사람", 및 외래 키 "person_id로"와 사용자의 각 유형에 대한 하나 개의 테이블을 만들 수 있었을 것이다.

사용자의 요청에 따라 한 유형의 사용자에 대한 모든 데이터를 얻으려면 foreign_key가있는 두 테이블을 조인하면됩니다.

몇 개의 사용자 유형이 있습니까?

+0

지금은 4이지만 유연함을 유지하고 싶습니다. 제가 언급 한 두 번째 해결책은 실제로 당신이 제안하는 것입니다 . – silkAdmin

2

디스크 공간을보다 효율적으로 사용할 수 있지만 별도의 테이블로 분할 할 때의 문제점은 조건부 조인이 필요하다는 것입니다. 즉, user_type을 기반으로 사용자 유형별 테이블에 조인해야합니다. 이것은 SQL로 코딩하는 데 어려움을 겪고 있으며 요즘 누가 디스크 공간을 염려합니까?

더 나은 옵션은 사용자 유형 인에 대한 정보를 저장하기에 충분한 열이있는 하나의 사용자 테이블을 가지며 일부 사용자 유형에는 일부 열이 사용되지 않는다는 것을 알고 있기 때문입니다. 사용되지 않는 컬럼을 갖는 "비 효율성"은 실행 속도와 질의 단순성에서 보완 될 것입니다.

또 다른 사용자 유형을 얻는 경우에도 쉽게 확장 할 수 있습니다. 테이블을 추가하는 것보다 열을 추가하는 것이 훨씬 쉽습니다. 더 많은 사용자 유형을 추가 할 때 새로운 열에 대한 요구 사항이 줄어들 것입니다 (단지 ' 귀하가 저장해야하는 사용자에 관한 여러 가지 점)

+2

나는 그것이 단지 거친 느낌 때문에 이걸 upvote하는 것을 싫어하지만, 실제로 진실이다. –

+0

나는 조인을 피하기 위해 코드를 훨씬 더 깔끔하게 만들 것이라고 동의하지만, PHP 클래스와 일치하는 테이블을 갖고 싶어한다. 더 우아한 느낌이들 것이다. – silkAdmin

+1

또한 이것에 대한 단점이 하나있다. 백엔드 코드에서 오류를 일으킬 수있는 모든 필드를 nullable로 만들어야합니다. – silkAdmin

관련 문제