회원 정보 테이블을 만들 적에
대부분 하나의 테이블에 사용자 정보 ( 이름/전화번호/주소/이메일 등등 ) 을 모두 몰아 넣는 경우가 있는데
이는 좋지 않은 방법이다.
안좋은 케이스를 예로 들자면
회원 테이블 하나만 유출 된다 하더라도 모든 회원 정보가 유출 되는 결과가 발생한다.
( 이게 아니라도 하나의 테이블에 사용자 정보가 함께 존재할 시에 감사에 걸린다. )
때문에 개인 정보마다 하나의 테이블을 생성 한 후에
각각의 유저마다 구분되는 키값으로 릴레이션을 거는 것이 좋다.
유저마다 구분되는 키값으로 보통 사용자 아이디를 생각하는 경우가 많은데
이 또한 그다지 좋은 방법은 아니다.
예를 들어 사용자 아이디를 PK로 사용할 경우에
사용자가 탈퇴를 하게 되면 곤란한 경우가 생긴다.
( 탈퇴한 사용자 정보를 삭제할 것인지, 보관할것인지
어떻게 취급 할지도 함께 생각해 봐야 할 문제. )
탈퇴한 사용자의 아이디를 그 후에 가입한 사용자가 다시 사용한다고 생각해 보자.
분명 탈퇴한 사용자와 새로 가입한 사용자는 아이디는 같을지 모르겠지만 다른 사용자다.
그런데 이럴 경우 예전에 썼던 글을 사용자 아이디로 검색 해보면
이전 사용자가 썼던 글들이 검색되는 경우가 발생한다.
때문에 사용자 아이디도 유니크한 값으로 취급 되어야 겠지만
PK는 겹치지 않는 값 ( 예를 들어 난수를 발생시킨다거나) 으로 사용하는 것이 좋다.
PK로 겹치지 않는 값을 사용하며, 이 값을 가지고 다닌다면
위와 같은 상황에서도 아이다가 같다해도 구분되는 PK값은 다르기 때문에
예전 탈퇴한 사용자의 글이 검색되는 일은 없을 것이다.
비밀번호나 주민등록번호등의 개인 정보를 보관 할 때에는
해쉬알고리즘을 사용하거나 (MD5나 SHA1 등) 해야지 암호화는 하지 말아야 한다.
암호화 한다는 말은 복호화가 가능하다는 말과 동일하다.
자주 쓰이는 컬럼은 인덱스로 지정하여 검색 비용을 줄이는 것도 잊지 말자.
컬럼명에 숫자를 쓰는 일은 없도록 하자
또한 fk로 지정된 컬럼이라고 혹여 fk_id 라는 식으로 앞에 fk라 명명 하는 일도 없도록 하자.
fk인것은 알수 있을 지언정, 어차피 컬럼명만 봐서는 어떤 테이블과 관계를 맺고 있는지 유추는 불가능하다.
( 한마디로 부질 없는 짓이다 )
[출처] 회원 테이블을 설계할 때에 주의해야 할 점|작성자 gigar
출처 - http://blog.naver.com/gigar?Redirect=Log&logNo=60115758916
==============================================================================================
질문
<회원 테이블>
-------------------
회원번호(PK)
-------------------
회원ID
비밀번호
이름
주민번호
.
.
.
-------------------
위와 같이 회원테이블이 어느 한 인터넷 포털 사이트에서 사용되어진다라는 가정하에..
회원 ID 컬럼 또한 유니크해야 하기때문에 충분히 기본키로 사용이 가능할텐데도..
굳이 회원번호라는 컬럼을 추가시켜 가면서까지 기본키로 선정하는 이유는 무엇인가요?
어느 한 강의 파일에서 저러한 내용이 나오길래 궁금해서 질문 드립니다.
그 강의 내용에서는..
"회원ID 컬럼을 기본키로 선정할 경우, 다른 테이블에서 회원ID를 참조키로 전이되어지게
되고 그러할 경우 한 회원이 탈퇴를 수행했을때 기존에 사용되었던 회원ID는 할당받지
못하도록 제약을 받게 된다."
대충 이런 식으로 설명을 하던데..
도저히 무슨 이야기인지 이해가 가질 않습니다.
답답한 마음에 이렇게 질문 올리는데..
쉽게 풀이해서 설명 좀 부탁드릴께요.
답변
강의내용과 같은 요건이 있다면 다음의 예와 유사한 case일 듯 하군요...;
회원번호는 numbering하여 매긴다고 가정하고, 회원ID는 회원가입 시 사용자들이 입력하는 로그인ID라고 가정하면 쉽겠네요.
편의상 회원테이블과 로그인한 내역을 관리하는 테이블만 가정합시다.
만약 'aa'라는 ID로 회원이 가입했을 경우, 로그인내역에 FK로 회원ID를 잡아 놓을 경우,
회원이 탈퇴를 하면 다른 회원이 'aa'라는 ID를 사용할 수 있어야 하는데 기존의 로그인내역에 'aa'의 ID로 데이터들이 있으니 이 내역들을 다 삭제하기 전에는 회원ID 'aa'를 삭제 할 수 없겠지요? 무결성을 무시하고 회원의 'aa'를 삭제 한다고 해도 다른회원이 'aa'로 가입하여 로그인하면 기존의 'aa' 로그인 데이터와 나중의 'aa' 로그인 데이터가 누가 누구의 데이터인지 구분할 수 없게 됩니다. 그렇다고 로그인내역에 회원명이나 주민번호컬럼등을 더 만드는 것은 데이터무결성에 또 다른 문제를 발생하게 됩니다.
이런 요건의 경우 회원번호를 number(22), 회원ID를 char(10) 정도로 관리하고 로그인내역의 FK를 회원번호와 연결시키면 위의 문제가 발생하지 않습니다.
물론 신규회원가입 시 회원번호는 그때마다 새로 따야합니다.
(회원번호가 회원의 unique key니 당연한 말이지요?)
이렇게 관리할 경우, 탈퇴하지 않은 회원 중 'aa'를 사용하는 회원이 없다면 기존의 이력데이터들의 존재 유무와 무관하게 신규회원은 'aa'라는 ID를 사용할 수 있습니다.
다만 가입회원ID Check시 탈퇴하지 않은 데이터중에 같은 회원ID가 있으면 중복오류를 내는 인덱스나 아래의 쿼리등의 장치는 추가로 필요하겠지요?
SELECT CASE WHEN COUNT(*) > 0 THEN '가입불가' ELSE '가입가능' END
FROM 회원
WHERE 회원ID = :가입할회원ID
AND 탈퇴여부 <> 'Y'; --> 탈퇴하지 않은 회원 중 가입할 ID를 사용하는 사람이 있는지 조사
제가 글 표현력이 딸려서 이해가 잘 되셨을지 모르겠군요...;
건승하시길...수고하세요~~
출처 - 네이버 지식
'DB > Common' 카테고리의 다른 글
데이터베이스 설계 과정 1 (0) | 2012.03.28 |
---|---|
테이블 설계 시 고려 사항 (0) | 2012.03.17 |
SQLite (0) | 2012.03.02 |
varchar와 varchar2의 차이와 number(5,2) 의미 (1) | 2012.02.13 |
CHAR()와 VARCHAR2() 차이 (0) | 2012.02.13 |