경진의 블로그

프로젝트 하면서 디비관련 PK와 FK 간단한 쓰임세. 본문

자바개발과정/기타(ETC)

프로젝트 하면서 디비관련 PK와 FK 간단한 쓰임세.

비회원 2008. 7. 11. 03:25
관계형 디비 테이블 관련해서 가장 필수요소? 라고 생각하는건 PK와 FK였는데...
(PK는 고유키. FK는 외래키.)
심혈을 기울여 다이어리 프로그램의 디비 테이블을 만들면서 넣었던 이 PK와 FK는 프로그램당시 걸림돌이 되었다. 그리하야 살짝 개념을 알려주려 한다.
경진스 알아서 정리하도록.

외래키로 부모와 자식 관계의 테이블을 만들기위해서는 부모테이블의 고유키가 자식테이블에 존재해야한다.
A라는 부모테이블에 ID의 고유키설정된 컬럼이 존재한다면, B라는 자식테이블에서는 ID라는 이름의 컬럼이 존재해야한다. 물론, 부모테이블의 ID와 자식테이블의 ID의 데이터형은 같아야 한다.

ALTER TABLE 쿼리문으로 관계모델을 만드는데. 쫍디쫍은 기억력의 한계로 까먹었다. 이해바람.

암튼지.. 이런식으로 관계를 만들어 버리면 몇가지 제약조건이 두 테이블 상에 존재하게 된다.
우선 부모 테이블인 A의 ID컬럼상의 user1이라는 데이터를 B테이블이 참조를 하게 될 경우 그 값을 바꿀수가 없다. 참조 무결성조건에 위배된다던가..? 아무튼 무결성조건에 위배된다. 왜?
참조관계를 만들어 버리면 B테이블의 데이터들은 A테이블에 종속된다 할 수 있다. 외래키가 user1인 B테이블의 모든 레이블은 A테이블의 user1에 영향을 받게 되는것이다. B테이블에서 user1의 상태를 주시하고 있는데 이걸 바꾸려고 하면 관계가 유지된 상태라 B테이블의 데이터를 어떻게 해야할지 모르는 공황상태가 되기 때문이라 생각 하고있다. 조금 불편한게.. 부모테이블의 user1을 바꿀경우 자식의 user1도 바뀌면 안되는건지... 찾아보긴 했는데 해답은 못찾았다. 아마 방법이 있을지도 모르겠다.

자식테이블에서는 어떠한 제약조건이 있을까? 데이터를 인서트 할 때 외래키를 꼭 넣어줘야한다. 그것도 부모테이블의 ID에 있는 데이터중 한개로. user1 user2 user3 이 부모테이블의 ID컬럼에 있다면 B테이블에 데이터를 집어 넣을때 저 셋중 한가지 골라잡아서 꼭 외래키 부분에 삽입해 주어야 한다.
관계를 만들면서 외래키는 부모와 자식 테이블에 이러한 제약조건을 심어준다.

쪼인해서 지우고 하면 될텐데 뭐하러 이런 관계까지 만들어서 제약조건을 늘리는 걸까?

한가지 예를 들어보자.

다음에 어떤 사용자가 가입을 하였다. user1 이라는 아이디를 지급받고 그에 해당하는 개인 신상 정보를 저장 하였으며 이메일 을 쓰고 카페가입도 하고 쇼핑까지 즐기며 블로깅까지 한다.

user1과 관련된 테이블이 몇가지가 될까? 대충 때려잡아 10개라고 가정할 경우, 만약 어떠한 이유로 user1이 아이디가 마음에 들지 않는다는 이유로 user2로 아이디를 바꾸고자 하였다. 외래키가 생성되지 않을경우 전혀 제약없이 바꾸는게 가능하다. 단, 이때 유저와 그에 해당하는 모든 정보들을 죄다 user2로 바꿔줘야할것이다.
바꿔준다 하고 넘어가자.
다음에서 서비스 잘 이용하던 이 user2  탈퇴를 신청한다. 이제 10개 테이블 모두 조인걸어서 해당정보 삭제작업 해줘야한다. 좀 복잡하다.

하지만 외래키를 이용한 참조방식은 위의 오류에 대한 사항을 제약해 버린다. 우선 user1이 무엇을 하던 디비에 저장이 될 경우 fk가 필수로 필요하기 때문에 user1의 정보가 디비에 저장될 경우 엉뚱한곳에 저장이되는 일을 방지 할 수 있다. 그리고 부모테이블이 제약을 받기 때문에 함부로 아이디를 바꾼다거나 할 수도 없다.
마지막. 탈퇴를 하여 데이터를 지울경우. 부모테이블의 user1을 지워주면 이를 참조하고 있는 자식테이블의 데이터도 함께 삭제가 된다.

여러사람의 로그인이 필요한 시스템에서 아이디 관리를 위해서는 아무래도 필수가 아닐까?

경진. 잘 정리해죠 +_+;;
0 Comments
댓글쓰기 폼
Prev 1 2 3 4 5 6 7 8 9 Next