개발자

RDBMS 실무 관계 연결 등 질문사항

2024년 12월 04일조회 69

혼자 프론트, 백엔드, 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는 인덱스로 묶어놓으면 더욱더 빨라지게 됩니다.

CP님의 프로필 사진

먼저 답변주신 분이 충분히 답해주신 거 같아 몇가지 첨언만 하자면, 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 를 활용할 것 같습니다.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2024년 12월 04일

1. RDBMS 테이블 간에 외래키 없이 사용할 때의 장점은 개발이 단순화되고, 레코드 추가나 제거시에 외래키 제약 조건으로 인한 오류를 피할 수 있다는 것입니다. 단점을 봤을 때, 데이터 정합성(Data Integrity)을 보장하기 어렵고 데이터 중복성 문제가 발생할 수 있습니다. 2. 관계를 설정하게 되면 DB 부하가 일부 증가할 수 있습니다. 외래키 연결은 자연스럽게 JOIN 연산을 필요로 합니다만, 이는 성능 저하를 야기할 수 있습니다. 그러나 이것이 항상 부담스럽지는 않으며, 적절한 인덱싱과 설계로 성능 저하를 경감시킬 수 있습니다. 3. 대형 플랫폼들이 모든 관계를 없애고 개발하는 것은 아닙니다. 실제로 많은 대형 플랫폼들이 RDBMS를 사용하며, 여전히 관계(외래 키 등) 설정을 활용합니다. 그러나 또한 NoSQL 같은 비관계형 데이터베이스도 사용하여 범위를 확장시킵니다. 4. DB에서 값들을 가져올 때 JOIN을 사용하지 않고 백엔드에서 처리를 하는 경우, 데이터베이스 쿼리의 복잡성과 실행 시간을 줄일 수 있는 장점이 있습니다. 또한, 각각의 쿼리가 단순해짐으로써 성능 최적화 역시 용이해집니다. 그러나 이런 방식은 백엔드 코드가 복잡해지며, 데이터 가공에 많은 시간이 소요되어서 전체 시스템의 성능에 영향을 줄 수 있습니다. 5. 대형 플랫폼에서도 상황에 따라 다릅니다. 일부는 RDBMS에서 JOIN을 광범위하게 사용하며, 일부는 조인 연산을 애플리케이션 로직(백엔드)에서 처리합니다. 결국 해당 서비스의 특성, 트래픽 양, 데이터 규모 등 여러 요소를 고려해 최적의 설계를 선택해야 합니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!