database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 29929 게시물 읽기
No. 29929
디비 설계에 대해서
작성자
김인수(newdb)
작성일
2011-03-07 10:33
조회수
9,751

안녕하세요..

새로운 프로젝트 진행 중에 디비 설계를 해야 하는데요.

데이터 구조가 대충 이렇습니다.

-------------------------------------------------------------------------------

회사 / 부서 / 팀장 / 사원

회사 필요 컬럼 : 고유코드, 이름, 전화번호

부서 필요 컬럼 : 고유코드, 이름, 전화번호, 상위 회사코드

팀장 필요 컬럼 : 고유코드, 이름, 전화번호, 상위 회사코드, 상위 부서코드

사원 필요 컬럼 : 고유코드, 이름, 전화번호, 상위 회사코드, 상위 부서코드, 상위 팀장 코드

--------------------------------------------------------------------------------------------------------------------------

이런 형태입니다.

원래 생각했던 테이블은

-------------------------------------------------------------------------

회사 테이블 : 고유코드, 이름, 전화번호

부서 테이블 : 고유코드, 이름, 전화번호, 상위 회사 코드

팀장 테이블 : 고유코드, 이름, 전화번호, 상위 회사코드, 상위 팀장 코드

사원 테이블 : 고유코드, 이름, 전화번호, 상위 회사코드, 상위 팀장코드

유저 테이블 : 고유코드,  pass, 회원 구분(여기에 로긴사용자가 회사냐 부서냐 사원이냐 유저냐 구분), relation_idx(회사면 회사테이블 코드, 부서면 부서테이블 코드 등등), 

---------------------------------------------------------------------------------------------------

이렇게 나눴습니다만 하나로 그냥 합칠까 생각중입니다.

-------------------------------------------------------------------------------------

하나의 사용자 테이블에

고유코드, 이름, 전화번호, 상위 회사코드, 상위 팀장코드, 상위 사원코드, id, pass로 놔두고 그냥 이거 하나로 쓸까 생각중인데요.

사원 입장에서는 사용자 테이블의 모든 컬럼(상위 회사/부서/팀장코드)를 다 쓰지만

회사 회원일 경우는 상위 회사코드/부서/팀장 컬럼은 필요하지 않아서 영원히 안 쓰게 됩니다.

 

각 회원별 테이블로 나눈다면 로그인 체크 후 로그인한 level을 찾아서 level에 따라 1이면 회사테이블로 가서 relation_idx를 가지고 회사정보를 가져오고

2면 부서 테이블로 가서 relation_idx를 가지고 부서정보를 가져오고 식입니다.

하나의 테이블로 합칠 경우 편리함이 더 많을 거 같긴 한데요. 그런데 바로 이렇게 안하는 이유는 지금은 생각치 못하는 다른 문제가 생길지 몰라서..

혹시 이와 비슷한 경우에 어떻게 고수분들은 쓰시는지 궁금합니다.

이런 경우는 흔할 거 같아서..

보통 유저별로 나누나요? 그렇다면 유저 테이블에 회원 구분 컬럼(level)과 해당 테이블의 고유 릴레이선 코드(회사면 회사코드, 부서면 부서코드 등등)의 두 필드는 필수로 있어야 할거 같은데. 그런가요?

고견 좀 부탁 드려요.. 몇일 째 고민 중이라 이젠 결정을 해야 할 거 같습니다. 

 

이 글에 대한 댓글이 총 4건 있습니다.

부서와 팀장 사이에 실장이 추가된다면?

팀장과 사원 사이에 파트장이 추가된다면?

혹은, 직책에 따른 상/하 개념 외에, 직군별로 직군장이 생겨서 결재 라인이 두 곳이 된다면?

 

이런 경우가 늘 존재할 수 있기 때문에, 각 '엔터티들'과 '엔터티들 사이'의 데이터는 분리하는 것이 일반적입니다.

이와 같은 이유로, 저는 별도의 테이블에서 사용자 사이의 관계를 저장하도록 작업해 왔습니다.

관계 테이블은 다음과 같습니다.

src 컬럼 : 특정 사용자 코드

dst 컬럼 : 특정 피사용자 코드

type 컬럼 : 연결 속성 코드

예: 홍길동 | 이몽룡 | task_boss -> 홍길동의 업무 처리에 대한 직속상관은 이몽룡이다.

예: 아이유 | 이효리 | approval_boss -> 아이유의 결재 처리에 대한 직속상관은 이효리다.

 

이렇게 작업을 해도, 또 하나의 의문이 생깁니다.

이몽룡의 상위 관리자로 춘향 실장이 있을 때, 홍길동 -> 춘향의 관계를 직접적으로 저장할 것인가, 아니면 홍길동 -> 이몽룡 -> 춘향과 같이 유추해서 알아낼 것인가? 에 대한 선택을 해야 합니다.

 

요청이 잦을 경우, 데이터 무결성 유지에 대한 관리 난이도 vs 성능에 대한 트레이드오프가 존재할 수 있으므로, 취향에 따라 선택하시면 되리라 생각됩니다.

박현우(lqez)님이 2011-03-09 00:25에 작성한 댓글입니다.
이 댓글은 2011-03-09 01:24에 마지막으로 수정되었습니다.

답변 감사드립니다.

써주신 댓글을 계속 곱씹어 이게 무슨말인가 생각하고 있습니다.

결국 한테이블에 다 담지 말고

회사테이블 / 부서테이블/ 팀장테이블/사원 테이블로 나누라는 말씀이시군요

그리고 USER 테이블을 하나 만들고

USER 테이블의 내용은 간단히

ID/PASSWORD /사용자구분(회사/부서/팀장/사원등)/해당테이블 고유코드(사용자가 회사면 회사테이블의 고유코드, 사용자가 부서면 부서테이블의 고유코드)

 

김인수(newdb)님이 2011-03-10 10:10에 작성한 댓글입니다.

다시 읽어보니 제가 단순한걸 너무 복잡하게 말씀드린 것 같습니다.

결론부터 말씀드리면, 사용자 테이블 1개, 관계 테이블 1개로 종료됩니다.

이중 취업은 위법이라 생각되니(^^), 회사 코드는 사용자 테이블에 그냥 컬럼으로 넣어도 될 것 같습니다

 

예를 들어 설명하는 것이 더 나을 것 같아 적어봅니다.

 

User 테이블 : PK, 회사, 사용자명, 부서, 직책

1, A, 길동, 개발팀, 사원

2, A, 몽룡, 개발팀, 팀장

3, A, 춘향, 개발실, 실장

4, A, 철수, 지원팀, 팀장

 

User_relation 테이블 : SRC, DST, TYPE

1, 2, 일반

2, 3, 일반

1, 4, 구매

 

위와 같이 보관하는 것을 생각했습니다.

'길동'씨가 일반 업무처리에 대한 결재 라인은 User_relation에 비추어 볼 때, 1->2, 그리고 2->3의 흐름을 타고 가게 됩니다. 구매 건에 대해서는 지원팀에 바로 요청이 가도록 설계되어 있으니, 구매 타입에 해당하는 1->4 흐름을 타고 가게되겠죠.

 

박현우(lqez)님이 2011-03-10 16:36에 작성한 댓글입니다.

 첫 댓글 말씀하신걸 곰곰히 여러번 읽어 보다

비슷한 컬럼이 많아서 저도 사용자 데이터는 한테이블로 갈려고 합니다.

--------------------------------------------------------------------------------------------------------------------------------------------------------

회사가 필요한 컬럼        : 고유코드, 이름, 전화번호, id, pass(회사 관리자 id로 사용)

부서가 필요한 컬럼        : 고유코드, 이름, 전화번호,id, pass 소속 상위 회사코드

팀장이 필요한 컬럼        : 고유코드, 이름, 전화번호,id, pass, 소속 상위 회사코드, 소속 상위 부서코드

사원이 필요한 컬럼        : 고유코드, 이름, 전화번호, id,pass, 소속 상위 회사코드, 소속 상위 부서코드, 소속 상위 팀장 코드

일반유저가 필요한 컬럼 : 고유코드, 이름, 전화번호,id,pass (일반유저는 상위가 없고 단독)

--------------------------------------------------------------------------------------------------------------------------------------------------------

보시다 시피 id, pass까지는 똑같과 그 아랫단으로 갈수록 필요한 상위 코드 정도만 늘어날 뿐입니다.

테이블 5개로 하기는 좀 아깝다(?)는 생각이 들어 말씀하신거와 비슷하게 된거 같습니다.

사용자 테이블 : 고유코드, 이름, 전화번호, id, pass, 상위코드, 사용자레벨(1:회사, 2:부서,3:팀장,4:사원,5:일반유저)

정도로 끝날꺼라 생각하는데

회사일경우 상위코드는 최상위니 상위코드값이 null, 사용자 레벨이 1

부서는 상위가 회사코드가 들어가면 되고 상위코드가 회사코드(레벨이 1인것중 하나)가 되고 사용자레벨은 2 등등 식으로

하면 될거 같은데 제가 초보라 맞게 하는지 모르겠습니다.

이전에 할때는 id, pass, level, relation_idx를 두어(각 사용자별 테이블이 따로 있엇습니다. 회사테이블, 부서테이블, 팀장테이블, 사원테이블 등등)

로긴을 하면 level로 판별하여 해당 테이블에 조인을 하는 방식을 했었습니다.

switch(level)

{

    case 1://회사

         $sql = "SELECT * FROM COMPANY WHERE com_idx = relation_idx"

      break;

    case 2 ://부서

       $sql = "SELECT * FROM DEPARTMENT WHERE dep_idx = relation_dx "

    ...

}

이런식으로 했습니다만 저 방식이 조금 불편하여 다른 방법을 모색하고자 했는데 조언 듣고 테이블 하나로 할 생각입니다. 그래도 될거 같아서

대략적 구조가

 회사1

   |-------- 부서

 

                 |----- 팀장

                            |----- 사원

  회사2

   |-------- 부서

 

                 |----- 팀장

                            |----- 사원

 

 일반회원

 일반회원

 

id, pass 테이블은 따로 나뉘는게 좋을거 같아서

총 2개 테이블로 할까 합니다.

1.사용자 테이블

   id, pass, relation_idx(사용자 정보 테이블의 코드 연결 코드)

2.사용자 정보 테이블

    고유코드, 이름, 전화번호, 상위코드, 사용자레벨(1:회사, 2:부서, 3:팀장, 4:사원, 5.일반유저)

 

한테이블에서 상위 레벨의 정보를 가져오는 쿼리는

http://dev.mysql.com/tech-resources/articles/hierarchical-data.html

을 참조하고 있습니다.

 

상세히 달아 주시는데 제가 초보라 이해도 및 흐름이 두서 없어서 죄송합니다.

 

 

김인수(newdb)님이 2011-03-14 09:56에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
29932mysql cluster 사용을 고민해 보면서.. [4]
humble
2011-03-09
9598
29931디비 백업후 복구작업중에 있습니다. 에러좀 봐주세요!! [7]
임두환
2011-03-09
13793
29930mysql password() 함수의 결과가 old_password()의 결과로 나옵니다. [2]
김영범
2011-03-08
8521
29929디비 설계에 대해서 [4]
김인수
2011-03-07
9751
29928.mysql_history에 대해서 [1]
김태경
2011-03-06
10296
29927mysql 과 서버 시간이 다른 경우 [1]
sumuri
2011-03-05
11454
29926MySQL 상용 라이선스 socket 관련 질문 드립니다. [1]
MySQL
2011-03-04
8972
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.048초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다