강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

산호초님의 프로필 이미지
산호초

작성한 질문수

데이터 분석 SQL Fundamentals

조인 실습 - 03

조인실습03 - join의 pk-fk join

해결된 질문

작성

·

62

0

안녕하세요 조인실습03 - 8:25에서 join 관련 질문입니다.

 

[ 이해한 내용 ]

- shippers의 shipper_id

- orders의 ship_via

컬럼명만 다를 뿐, shipper_id가 pk컬럼인데,

orders에서 fk로 만들 때 ship_via로 만든 것이다.

그래서 두 컬럼이 조인된다.

 

[ 궁금한 사항 ]

두 컬럼이 PK - FK 관계라는 판단 근거가 어떻게 되나요?

Dbeaver에서 이를 쉽게 확인할 수 있나요?

제가 수강한 진도까지는 이러한 내용이 나오지 않고

ERD를 봐도 모르겠어서 질문드립니다.

답변 2

1

안녕하세요, 인프런 AI 인턴입니다. 산호초님, 질문 주셔서 감사합니다.

SQL에서 서로 다른 두 테이블이 조인되는 이유는 주로 Primary Key(기본 키)Foreign Key(외래 키)의 관계를 통해 이루어지게 됩니다. 이 관계를 쉽게 이해하기 위해 다음 설명을 통해 도와드리겠습니다.

PK-FK 관계 이해하기

  • Primary Key (PK): 각 테이블의 행을 고유하게 식별하는 데 사용되는 키입니다. 각 행의 고유한 값을 보장해야 합니다.
  • Foreign Key (FK): 다른 테이블의 Primary Key를 참조하는 키로, 테이블 간의 관계성을 나타냅니다.

예시로 주어진 shippers 테이블의 shipper_id는 그 테이블의 Primary Key 역할을 하며, orders 테이블의 ship_viashippers테이블의 shipper_id를 참조하는 Foreign Key로 작동됩니다. 그래서 조인이 가능합니다.

판단 근거 확인하기

  1. ERD (Entity-Relationship Diagram): ERD는 테이블 간의 관계를 시각적으로 나타낸 그림입니다. 여기서 각 테이블 간의 관계를 이해하는데 활용될 수 있으며, 보통 라인으로 연결되며 외래 키는 다이아몬드 모양의 표시로 나타납니다.

  2. DB 툴 (예: DBeaver) 활용:

    • DBeaver와 같은 데이터베이스 툴에서 특정 테이블을 선택하고 “ERD” 또는 “Relationship” 뷰를 사용함으로써 테이블 간의 관계를 시각적으로 쉽게 확인할 수 있습니다.
    • shippersorders 테이블 사이에 shipper_idship_via 간의 관계를 확인할 수 있습니다. 보통 관계선과 관계선 끝의 기호를 통해 PK와 FK 관계를 추측할 수 있습니다.

적절한 외래 키 관계의 설정은 데이터베이스의 무결성과 참조 정확도를 보장하며, 이러한 관계를 활용하여 조인의 정확성을 높일 수 있습니다.

관련된 내용의 유사한 질문 및 답변을 확인하시려면 다음 링크를 참고해 주세요:
- 게시글: Outer join실습 02 관련

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

산호초님의 프로필 이미지
산호초
질문자

image.png



아 방금 확인했는데, ERD에서 shippers 엔터티의 PK인 shipper_id를 클릭하니, order의 ship_via도 강조 표시되어, PK-FK 관계임을 쉽게 알 수 있네요. 반대로 클릭해도 마찬가지입니다.

0

권 철민님의 프로필 이미지
권 철민
지식공유자

동일한 질문을 두번 올리셨군요. 인프런 AI인턴에서 답변을 찾으셨군요.

이전 질문에 제 답변도 드렸습니다. 이전 강의인 데이터 연결 파악하기 영상의 12분 정도에서 다시 한번 확인해 보시면 좋을 것 같습니다.

감사합니다.

산호초님의 프로필 이미지
산호초
질문자

  1. 질문 중복 기재는 인프런 시스템 문제인 것 같습니다. 혹시 문제되면 이전 글을 삭제하겠습니다.

  2. 제가 궁금했던 것은 'shipper_id가 PK다', 'shippers와 orders의 카디널리티 관계는 이러하다'라는 것이 아니라, shipper_id라는 PK에 대응되는 orders의 FK가, orders 테이블에 있는 수많은 컬럼 중에 'ship_via'라는 것을 판단하는 근거를 질문드린 것입니다.. '데이터 연결 관계 파악하기'에서 'ship_via'에 대한 설명은 나오지 않는 것 같습니다.

권 철민님의 프로필 이미지
권 철민
지식공유자

수많은 컬럼 중에 'ship_via'라는 것을 판단하는 근거라는 게 정확히 뭘 의미하는지 잘 모르겠습니다만

shippers는 shipper_id가 PK를 가지는 shipper에 대한 주요 정보를 가지는 Master성 테이블입니다. 그리고 orders는 shippers 테이블을 참조하기 위해서 ship_via 컬럼명을 가지고 있으므로 ship_via 컬럼은 FK가 됩니다. 그렇게 실습 테이블의 테이블 구조가 되어 있습니다. 그래서 orders와 shippers 테이블을 서로 join에서 연결하여 사용할 수 있습니다. orders와 shippers는 서로 shipper_id와 ship_via 컬럼으로 연결이 되니까 join절에서 사용하시면 됩니다.

아직 충분한 답변이 되지 않았다면, 생각하시는 판단하는 근거의 예시라던가, 추가적인 부분을 좀 더 자세히 기술해 주시면 제가 답변하는데 더 도움이 될 것 같습니다.

 

 

산호초님의 프로필 이미지
산호초
질문자

저는 "shipper_id라는 PK에 대응되는 orders의 FK가, orders 테이블에 있는 수많은 컬럼 중에 'ship_via'라는 것을 판단하는 근거"라고 물어봤는데 왜 "수많은 컬럼 중에 'ship_via'라는 것을 판단하는 근거"라고 의도를 파악하신지 잘 모르겠습니다만,

  • 'shippers' 테이블에서 PK가 'shipper_id'인 것은 알겠다

  • orders에서 FK는 뭘까? shipper_id가 없네? ship_via인가? freight인가? 혹은 다른 컬럼인가? 어떻게 이 관계를 알 수 있지? 여기선 ship_via라고 추론할 수 있겠지만 나중에 컬럼이 더 많은 복잡한 경우엔 어떻게 판단할 수 있을까? 이전 강에서 아무리 찾아봐도 이에 대한 내용은 없네?

이게 제 궁금증의 전부입니다. 저희의 대화 내용을 긁어서 AI에게 물어보면 도움이 되실 것 같습니다. 저희의 대화 내용을 긁어서 Gemini 2.5 Pro에게 요청한 추가 질문으로 갈음합니다.

 

**To: 권철민 강사님**
**From: 산호초**

강사님, 상세한 답변 감사드립니다.

강사님께서 "shippers는 마스터 테이블이고, orders는 참조를 위해 ship_via를 가지고 있으며, 실습 테이블 구조가 원래 그렇게 되어 있다"고 설명해주신 덕분에, **이 실습 데이터베이스의 설계 의도는 명확히 이해했습니다.**

제가 정말 궁금했던 점을 다시 한번 명확하게 여쭤보고자 합니다. 제 질문의 핵심은 **"어떻게 그 사실을 알 수 있는가?"** 입니다.

강사님께서 모든 구조를 알고 계신 이 실습 환경이 아니라, 제가 만약 실무에서 데이터 명세가 없는, 처음 보는 데이터베이스를 분석해야 하는 상황이라고 가정해 보겠습니다. `orders` 테이블에는 수십 개의 컬럼이 있고, `shippers` 테이블도 처음 봅니다.

이런 막막한 상황에서, '`orders` 테이블의 `freight`도 아니고 다른 컬럼도 아닌 `ship_via` 컬럼이 `shippers` 테이블의 `shipper_id`와 연결되는구나!' 라는 사실을 아는 방법과 근거가 궁금합니다.

제가 원하는 답변은 아래와 같은 내용입니다.

1.  **도구를 사용한 확인법 (DBeaver 등):**
    DBeaver와 같은 GUI 툴에서, 이 두 컬럼이 Foreign Key(외래 키)로 공식 설정되어 있는지 **어떤 메뉴나 속성 창을 통해 확인할 수 있나요?** (예: `orders` 테이블 우클릭 -> `메뉴1` -> `메뉴2` 탭 확인과 같은 절차)

2.  **SQL을 통한 추론법:**
    만약 DB에 공식적인 FK 제약 조건(Constraint)이 설정되어 있지 않다면, 어떤 **SQL 쿼리**를 통해 두 컬럼의 데이터 값 분포나 종류를 비교하여 '아, 이 두 컬럼이 관계가 있겠구나' 라고 **논리적으로 추론하고 증명**할 수 있을까요?
    (예: `SELECT DISTINCT ship_via FROM orders;` 의 결과와 `SELECT shipper_id FROM shippers;` 의 결과를 비교하는 방법 등)

요약하자면, 저는 '주어진 정답'이 아니라 **'정답을 찾아가는 실무적인 과정과 노하우'**가 궁금한 것입니다.

 

권 철민님의 프로필 이미지
권 철민
지식공유자

 

  1. 도구를 사용한 확인법은 이미 Dbeaver에서 사용해 보셨듯이 PK-FK 관계가 물리적인 Constraint 관계가 걸려 있으면 ERD 그려줄 때 나타날 수 있습니다.

     

  2. 실제 DB에는 성능이슈로(특히 대용량 테이블의 경우) 보통 FK를 잘 만들지 않습니다. 그래서 문서상(ERD나 아닌 다른 형태로) 서로 연결관계를 표시합니다. SQL로 추론하는 것은 보통 컬럼명으로 동일(유사)하거나 아님 Group by 등의 값으로 실제로 값 자체를 비교해서 합니다. 보통은 문서 방식이 활용되며 SQL 추론은 문서나 물어볼 사람이 없을 경우에 사용합니다.

 

산호초님의 프로필 이미지
산호초

작성한 질문수

질문하기