회원테이블 외래키 질문있습니다. 0 7 1,085

by 대학생 [DB 모델링/설계] [2018.03.13 23:36:18]


안녕하세요..!! 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를 참조하도록 하는게 맞는거 같으면서도

아닌거 같기도하고.. 확신이 안서서 질문드립니다.

이런 경우 보통 어떻게 하나요..!

 

 

 

by 마농 [2018.03.14 07:41:29]

왜? id 와 no 두가지를 나누어 관리할까요?
애초에 ID 하나만 관리하면 되지 않나요?


by 대학생 [2018.03.14 09:24:33]

처음에는 id를 기본키로 설정했는데요. 

전자 메일 주소를 기본 키로 사용하는 단점 :

1. 조인 할 때 느려집니다.

게시 된 외래 키가있는 다른 레코드는 더 큰 값을 가지므로 더 많은 디스크 공간을 차지합니다. (오늘날 디스크 공간의 비용을 감안할 때, 이것은 레코드가 읽기에 오래 걸리는 것을 제외하고는 사소한 문제 일 것입니다. # 1 참조).

2. 전자 메일 주소가 변경되어이 키를 외래 키로 사용하여 업데이트하는 모든 레코드를 강제로 업데이트 할 수 있습니다. 전자 메일 주소가 자주 변경되지 않으므로 성능 문제가 미미합니다. 더 큰 문제는 당신이 그것을 제공해야한다는 것입니다. 코드를 작성해야하는 경우 더 많은 작업이 필요하며 버그가 발생할 수 있습니다. 데이터베이스 엔진이 "on update cascade"를 지원하는 경우 사소한 문제입니다.

전자 메일 주소를 기본 키로 사용하면 다음과 같은 이점이 있습니다.

1. 일부 조인을 완전히 제거 할 수 있습니다. "마스터 레코드"에서 필요한 것이 전자 메일 주소이면 추상 정수 키를 사용하여 검색하려면 조인을해야합니다. 키가 전자 메일 주소 인 경우 이미 전자 메일 주소가 있으므로 조인은 필요하지 않습니다. 이것이 당신을 도울 지 여부는이 상황이 얼마나 자주 발생하는지에 달려 있습니다.

2, 임시 쿼리를 수행 할 때 사람이 참조하는 마스터 레코드를 쉽게 볼 수 있습니다. 데이터 문제를 추적 할 때 큰 도움이 될 수 있습니다.

어쨌든 이메일 주소에 대한 색인이 거의 필요할 것이므로 기본 키로 만들면 하나의 색인이 제거되므로 삽입물의 성능이 향상됩니다. 이제는 두 개가 아닌 하나의 색인 만 업데이트됩니다.

라는 논점이 있더군요. 그래서 no로 약한엔티티 설정하고 id에 유니크값을 적용했습니다. 사실 어떤것이 좋은지는 

아직 혼자 판단이 잘 안되서 일반적으로 많이하는 약한엔티티로... 했습니다.!


by 우리집아찌 [2018.03.14 09:13:50]

user 테이블 하나만 두고 컬럼하나 추가하세요. (관리자 , 학생 , 교수)  


by 대학생 [2018.03.14 09:19:42]

답변감사합니다.!!  여기서는 질문을 위해 간략하게 올린것인데요. 실제로는 유저와 교수의 테이블안에 들어가는

속성이 다르기때문에 분리했습니다.


by 우리집아찌 [2018.03.14 09:52:32]

속성이 다르다면 서브타입으로 분기할수도 있습니다.

그리고 이메일 같이 변경이 되는 컬럼 후보식별자로 쓰이지않아서 PK가 될수가 없습니다.


by 마농 [2018.03.14 09:29:35]

이메일 주소가 ID 이고 ID 가 변경이 가능한 경우라면? NO 를 별도 키로 두는 것이 맞을 것입니다.
이 때 참조되는 다른 테이블에서는 ID 컬럼을 둘 이유가 없습니다.(정규화 위배)
그런데 ID 가 메일주소인데 학생테이블에 메일주소 컬럼이 따로 또 있네요?


by 대학생 [2018.03.14 18:14:57]

아.. 감사합니다.!!! 이해됐습니다.!! 

유저테이블이랑 학생테이블 1:1이라서

학생테이블에서 기본키이면서 외래키(유저테이블no)  잡으면 될 것 같습니다.!!

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