먼저, sql table의 primary key를 id라는 이름으로, 특별한 값을 넣지 않고 long이나 int형으로 숫자로 많이 두곤 한다.
sql에서 join이나 data 탐색 등의 경우의 수를 생각해 봤을 때, primary key에 유의미한, 그리고 식별이 되는 값을 넣는게 좋지 않을까? 실제로 성능은 이게 더 나올 것이다. 그러나 이렇게 하지 않는 이유는
1) 보안상의 이유
2) 확장성의 이유
크게 2가지가 있다고 생각한다.
먼저 primary key는 어떤 일이 있더라도 겹치면 안 된다는 것은 기본이다. 예를 들어서 member라는 table에 id를 member가 회원가입할 때 등록했던 id로 지정했다고 해 보자. 그러면 member.id는 varchar형태일 것이고, id는 중복이 되지 않으니 pk로써 요건도 충족한다.
그러나 이 상황에서 어떤 member가 탈퇴해 버리면 이 id를 이용해서 값을 가지고 있던 모든 table에 있는 값을 수정해야 할 것이다. 또한, member의 id가 변경되는 경우 모든 table의 모든 data를 찾아 변경해야 한다.
반면, auto_increment로 값을 할당하면 이런 문제가 없고, 확장하기도 쉽다. 또한, 보안상의 문제에서도 sql을 해킹했을 때 member id가 바로 나온다면 뭔가 문제가 있지 않겠는가? (정확한 표현은 아니지만)
따라서,
1) table id는 의미없는 long, int 형식의 값을 사용하고
2) 해당 table에서 자주 검색하는 것은 index로 지정하며
3) unique한 것은 unique로 설정하게 하며
4) 가능하면 비식별관계로 erd를 짜자.
'Development > SQL' 카테고리의 다른 글
[Troubleshooting] 쿼리 최적화 : Subquery -> JOIN (0) | 2023.06.08 |
---|