안녕하세요..!! DB설계에 대해 처음으로 많은 생각을 가지게 되었는데요.
로그인에 사용될 유저테이블과 사용자의 정보가 들어가있는 관리자테이블 , 학생테이블 , 교수 테이블이 있습니다.
회원가입시 유저테이블에 먼저 insert되고 회원등급에 맞게 관리자 혹은 학생 혹은 교수 테이블에 회원 정보가 입력되도록 트랜잭션을 걸었습니다.
CREATE TABLE `test`.`tbl_user` ( `user_no` INT NOT NULL, `user_id` VARCHAR(45) NOT NULL, `user_pw` VARCHAR(45) NOT NULL, `user_grade` INT NOT NULL, PRIMARY KEY (`user_no`), UNIQUE INDEX `user_id_UNIQUE` (`user_id` ASC));
학생테이블은
CREATE TABLE `test`.`tbl_student` ( `student_no` INT NOT NULL, `student_id` VARCHAR(45) NOT NULL, `student_name` VARCHAR(45) NOT NULL, `student_email` VARCHAR(45) NULL, `student_department` VARCHAR(45) NULL, PRIMARY KEY (`student_no`), UNIQUE INDEX `user_id_UNIQUE` (`student_id` ASC));
학생테이블에서 student_id 를 user_id 를 참조하도록 하였습니다. ( user_id가 기본키가 아닌데도 외래키가 설정되더군요..)
그냥 아무생각 없이 id끼리 외래키를 걸었는데 생각해보니 student테이블에서 user_no를 참조하도록 하는게 맞는거 같으면서도
아닌거 같기도하고.. 확신이 안서서 질문드립니다.
이런 경우 보통 어떻게 하나요..!
처음에는 id를 기본키로 설정했는데요.
전자 메일 주소를 기본 키로 사용하는 단점 :
1. 조인 할 때 느려집니다.
게시 된 외래 키가있는 다른 레코드는 더 큰 값을 가지므로 더 많은 디스크 공간을 차지합니다. (오늘날 디스크 공간의 비용을 감안할 때, 이것은 레코드가 읽기에 오래 걸리는 것을 제외하고는 사소한 문제 일 것입니다. # 1 참조).
2. 전자 메일 주소가 변경되어이 키를 외래 키로 사용하여 업데이트하는 모든 레코드를 강제로 업데이트 할 수 있습니다. 전자 메일 주소가 자주 변경되지 않으므로 성능 문제가 미미합니다. 더 큰 문제는 당신이 그것을 제공해야한다는 것입니다. 코드를 작성해야하는 경우 더 많은 작업이 필요하며 버그가 발생할 수 있습니다. 데이터베이스 엔진이 "on update cascade"를 지원하는 경우 사소한 문제입니다.
전자 메일 주소를 기본 키로 사용하면 다음과 같은 이점이 있습니다.
1. 일부 조인을 완전히 제거 할 수 있습니다. "마스터 레코드"에서 필요한 것이 전자 메일 주소이면 추상 정수 키를 사용하여 검색하려면 조인을해야합니다. 키가 전자 메일 주소 인 경우 이미 전자 메일 주소가 있으므로 조인은 필요하지 않습니다. 이것이 당신을 도울 지 여부는이 상황이 얼마나 자주 발생하는지에 달려 있습니다.
2, 임시 쿼리를 수행 할 때 사람이 참조하는 마스터 레코드를 쉽게 볼 수 있습니다. 데이터 문제를 추적 할 때 큰 도움이 될 수 있습니다.
어쨌든 이메일 주소에 대한 색인이 거의 필요할 것이므로 기본 키로 만들면 하나의 색인이 제거되므로 삽입물의 성능이 향상됩니다. 이제는 두 개가 아닌 하나의 색인 만 업데이트됩니다.
라는 논점이 있더군요. 그래서 no로 약한엔티티 설정하고 id에 유니크값을 적용했습니다. 사실 어떤것이 좋은지는
아직 혼자 판단이 잘 안되서 일반적으로 많이하는 약한엔티티로... 했습니다.!