개발자
혼자 프론트, 백엔드, DB 공부를 강의 보면서 독학하고 있는데 이번에 토이프로젝트로 쇼핑몰 웹을 하나 만들려고 합니다. 실무에서는 개발을 어떤식으로 하는지 궁금하여 질문 드립니다. 1. mysql 등 과 같은 RDBMS 테이블 관에 관계를 설정 안 하고 즉 외래키 연결 하나도 안 하고 사용할 때 장단점이 무엇인가요? 2. 지인 DBA분(오래 되심)께서 하시는 말씀은 관계 연결하면 DB 부하 심하다, 성능 저하된다 이런식으로 말씀하셨는데 맞나요? 2-1. 성능이 저항된다면 심하게 저하되나요? 3. 쿠팡, G마켓, 무신사, 유튜브 등과 같은 대형 플랫폼들은 RDBMS를 사용할 때 실제로 관계 연결을 안 하나요? 4. DB에서 값을 불러 올 때도 join 하나도 안 하고 소프트웨어적으로 수동으로 연결 한다. 제가 이해 하기로는 사진에 있는 예시 사진 참고 하면서 예를 들면 cart 불러오는데 user이름도 알아야 한다면 DB에 join을 해서 가져오는게 아니라 백엔드에 각 각 user, cart를 따로 호출하고 백엔드에서 if, for, array function 같은 메소드를 사용해 작업을 거쳐 가공 한다는 것 같은데 이러면 실무 적으로 봤을 때 장단점이 무엇인가요? 5. 대형 플랫폼 같은 실무에서는 4번 방식 처럼 하나요? 참고로 테이블이 20개 이상 정도 될 경우의 상황이 궁금합니다 실무에 관해서 민감한 질문 드려서 죄송합니다. 아는 것 없이 질문을 여러번 드려 번거롭게 만들어서 죄송합니다. 답변해 주신다면 열심히 공부하겠습니다.

답변 2
본 답변은 제 개인적인 실무경험과 생각을 토대로 답변합니다. 안녕하세요. ## 1번 답변 RDB는 풀어서 말해보자면 "릴레이션 데이터베이스" 입니다. 릴레이션은 한국말로하면 관계죠. 즉 관계로 이루어진 데이터베이스입니다. 장단점이라고 하긴 뭣하지만. 보통 관계로 연결을하고 외래키로 묶는경우 외래키에 업데이트 or 삭제될 경우에 제약조건을 주게됩니다. 부모테이블에 관계로 엮여진 row가 delete, update되는경우 자식테이블에 해당 row도 같이 update를 할건지 delete를 할건지, 아님 데이터를 null로 만든다던지 이렇게 설정을 할수가있습니다. 여기서나온 내용을 토대로 질문에 대한 답변을 하자면 - 관계설정을 한 경우 : 외래키로 묶여진 부모테이블에서 update, delete되는경우 자식테이블도 같이 변경 - 관계설정을 안한 경우 : 아무런 동작없음 ## 2(2-1)번 답변 저는 전혀 그렇게 생각하지 않습니다. 불론 JOIN이라던지 Sub Query가 많고 DB Function을 사용하는 경우고 result row가 많을수록, 테이블에 인덱싱이 안되어있을경우 성능이슈가 발생할순있지만, 오히려 View테이블을 만들어서 쓰는게 성능이슈가 더 발생할듯싶습니다. 관계를 쓰면 느려지는게아니고 SQL구문을 어떻게쓰냐에 따라 퍼포먼스가 달라지게됩니다. ## 3번 답변 안할리가 없습니다. 대신 대규모 서비스들은 MSA방식이라고해서 기능별로 분리를 하는것으로 알고있습니다. 코드도 그렇고 데이터베이스도 그렇구요. 아무래도 대규모 트랜잭션이 발생하는 서비스들이다보니. 기능별로 관리하는걸로 알고있습니다. ## 4번 답변 4번같은경우는 정말 비효율적인 방식인거같습니다. 왜냐하면 DB에서는 그런기능들을 제공해주고있는데 사용을 안하는것이지요. JOIN과 sub query를 적절히 사용한다면 큰부하는 없을것이고. 수십, 수백만 row에서 부하가 발생한다면 DB를 바꾸는 방법도 고려해야겠지요. 인메모리 데이터베이스라던지, 오라클같은 대규모 트랜잭션이 용이하고 담당어시스턴트가있는 서비스를 받는다던지.. ## 5번 답변 4번과 이하동문 ## 20개이상테이블 그만큼 join을 주면되겠죠. 4번처럼 프로그램적으로 후처리를 한다면 저부분이 시간이 더걸릴듯 싶습니다. 각테이블의 컬럼과 규모를 모르겠지만. 한번 execute시간을 체크해보세요. DB의 성능적 퍼포먼스와 부하는 어떻게 설계를 하느냐에 따라 달라집니다. 가령 테이블의 엔진이라던지, 인덱스 유무라던지, 컬럼중에 가변식길이가 있는지 등등 그리고 sql을 쓸때도 *처럼 전체를 불러오는거보단 필요한 컬럼만 불러오는게 빠르고 where절을 쓸때도 not 보단 동일하다를 사용하는게 빠르구요, where절에 a,b,c 컬럼을 준다면 a,b,c는 인덱스로 묶어놓으면 더욱더 빨라지게 됩니다.
먼저 답변주신 분이 충분히 답해주신 거 같아 몇가지 첨언만 하자면, Q1. 외래키 사용 안 하는 장점 부모테이블이 개인정보가 포함된 마스터 테이블, 자식테이블이 개인정보가 없는 상세 테이블인 경우, (회원 탈퇴 등으로) 부모 테이블의 row가 삭제되더라도 자식 테이블의 연관 row들은 남겨두고 싶을 수 있습니다. 데이터 분석/통계나 (개인정보가 없는) 사용자 추적용으로요. 꼭 개인정보가 아니더라도 어떤 상품을 삭제 했을 때 상품에 적용했던 할인내역이나 조회/수정 했던 이력 등은 남겨 놓고 싶을 수 있겠죠 물론 이런 상황에서도 정석적인 방법은 외래키를 쓰고, update/delete 트랜잭션의 cascade 옵션 등을 관리하는거겠지만, 관리가 귀찮아서 안 하는 경우를 많이 봤습니다.. Q4~5. DB join 대신 소프트웨어로 이 부분은 좀 오해의 여지가 있는거 같은데, DB join을 SQL 로 직접 써서 하지 않고, ORM과 같은 프레임워크 도움을 받아 코드로 작성하는 join을 한다-가 맞는것 같습니다. ORM에 대해 한번 찾아보시고, 실무에서는 ORM을 정말 많이 씁니다. 이유는 여러가지겠지만 대표적으로는 1. 설계 입장) 프로그래밍 시점에 객체지향 설계와 DB 테이블 설계가 중복되니 한번만 하자 2. 개발자 입장) 프로그래밍 언어와 SQL을 스위칭하는 코스트 절약 + SQL 작성에 대한 자동완성/컴파일에러 등 IDE 지원 등이 있습니다. * 여담으로 테이블 20개를 조인해야 하는 상황이라면 과정규화된게 아닌가.. 의심해봅니다. 역정규화를 고민해보시고, 정말 필요하다면 view 를 활용할 것 같습니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!