DB 테이블 설계 질문 있습니다. 0 8 2,567

by 대학생 [DB 모델링/설계] [2018.03.07 14:29:29]


안녕하세요.! DB설계후 웹 개발 프로젝트를 진행하려 합니다.

교수와 학생을 유저등급으로 구분하여  유저테이블에 같이 설계했었습니다.

user_num : {type : DataType.INTEGER , primaryKey : true , allowNull: false}, 

user_id: { type : DataTypes.STRING, allowNull: false, unique: true},

user_password: { type : DataTypes.STRING, allowNull : false },

user_grade: { type : DataTypes.INTEGER, defaultValue : "1" },

유저등급으로만 구분했었습니다.

설계하다보니 교수테이블을 참조해야하는 테이블이 생겨서 학생과 교수를 분리했습니다.

분리하고나니 로그인테이블을 어떻게 해야하나 생각하다가 교수테이블과 학생테이블을 UNION 하여 VIEW 를 생성해서

VIEW를 참조하여 로그인을 제공하려했으나 데이터 20만건일때 응답속도가 1초 가량 나와서 사용할 수 없을거 같습니다.

 

보통 유저등급이 존재하는 테이블은 로그인 테이블을 어떻게 설계하나요..

by 우리집아찌 [2018.03.07 14:39:22]
-- 전체적으로 정보가 부족하네요. 로그인 테이블이 뭔지는 모르겠습니다만


SELECT * FROM 교수테이블 WHERE USER_ID = :유저
UNION  ALL
SELECT * FROM 학생테이블 WHERE USER_ID = :유저

 


by 신이만든지기 [2018.03.07 14:47:44]

모델링에는 정답이 없다고 말을 많이 합니다. 

여러 방법이 있겠지만,

로그인 화면에서 "라디오버튼" 또는 "셀렉트박스"를 두어 로그인하려는 사용자가 직접 학생/교수를 선택하게 하고, 1개의 테이블만 조회할 수도 있겠습니다.

 


by 대학생 [2018.03.07 23:52:18]

답변 감사합니다.!! 라디오버튼을 통해 하나의 테이블만 조회하게 하는 방법 정말 좋은것 같습니다.

다만, ID와 패스워드만으로 로그인하여 유저등급에 맞는 페이지를 보여주고 싶습니다. 

이럴경우 로그인시에만 사용할 테이블을 따로 만드는 방법은 괜찮은건가요..?

교수와 유저는 공통적으로 아이디 패스워드 이름 전화번호 이메일 학과코드 가 들어갑니다.

 


by 마농 [2018.03.07 14:50:50]

1. 테이블 분리에 대해
 유저 테이블에서 등급으로 구별이 가능한데?
 분리하신 이유가 교수만 참조하는 경우가 생겨서 인가요?
 분리에 대한 충분한 이유는 아닌데요.
 교수와 학생의 속성이 다르다거나
 분리하는 것이 관리상 도움이 된다거나, 성능상 좋다거나 하는
 충분한 이유가 있어야 할 것입니다.
2. UNION 에 대해
 UNION 은 잘 사용하지 않는 명령입니다. 대부분의 경우 UNION ALL 로 해결됩니다.
 그런데도 불구하고 UNION ALL 을 써야 할 곳에 UNION 을 사용하는 경우가 많은데요.
 UNION 을 잘못 사용하면 성능저하가 발생될 수 있습니다.


by 대학생 [2018.03.08 00:00:38]

1. 네 맞습니다. 교수와 유저의 속성이 같았습니다. 그렇기때문에 유저등급이라는 속성을 통해 교수와 유저를 구분하려 했었습니다. 홈페이지의 기능을 추가하게 됨으로써 교수와 학생의 속성이 달라졌습니다. 그래서 교수와 학생을 분리하려고 하는데 로그인에 사용될 아이디와 패스워드를 어떻게 해야할지 모르곘습니다. 로그인을 위한 테이블을 하나 생성하는 것이 과연 올바른 방법인지 잘모르겠습니다. 

2. 제가 사용한것이 잘못된 방법인듯 합니다. DB의 사용법에 대해나 배웠지 제대로된 DB를 배워본적이 없어 생각해낸것이 분리된 테이블을 합치고( UNION ) 데이터를 중복으로 저장하지 않기위해 VIEW 를 생각했습니다. 물론 결과적으로 성능저하가 엄청나게 일어났습니다. 제가 한 방법이 잘못된 방법인듯합니다.  정말 두서없이 쓴글에 정성스러운 답변 정말 감사합니다.!!

 


by 마농 [2018.03.08 08:13:57]

1. 교수, 학생과 별도로 유저 테이블이 따로 있어야 하지 않을까요?
 - 즉 기존 테이블을 유저 테이블로 하고
 - 교수와 학생은 별도로 만들어야겠습니다.
2. 지금 상태에서는
 - Union 을 Union All 로 바꾸시면 성능 향상될 것입니다.


by 대학생 [2018.03.08 13:06:41]

정말정말 감사합니다.!! 

union과 union all 의 성능차이는 인지하고 있지 못했던 부분인데 sort의 영향이 있군요.! 정말 좋은 공부가 되었습니다.

또한 all 로 해본결과 0.985sec -> 0.750 sec 으로 성능이 향상되었습니다. 문자열 컬럼의경우 1.671sec -> 1.110 sec 이나 좋아졌습니다.!! 답변 정말 감사합니다.!~


by 마농 [2018.03.08 13:33:33]

글쎄요? 그정도 가지고 빨라졌다고 할 수 있는 수준인지?
로그인 뷰를 id 조건으로 검색한다면? 0.00x 대로 나와야 하는 것 아닌가요?
id 로 검색하면 인덱스 타고 바로 결과가 나와야 하는데요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입