개념설명 -> 이해 X
실습하기 -> 이해 X
실패, 원인찾기, 의문갖기, 도전하기 -> 이해 OOOOOO !!
따라서 이해하기 위해 고군분투 했던 것을 떠올리며 개념을 정리하기 위해 글을 남긴다.
먼저 Database modeling을 정리하기 전 간단하게 관계형 데이터베이스에 대해 정리했다. (실습과제에 대한 리뷰 이후에 올릴것!!!!)
먼저 Database 란 일반적으로 컴퓨터 시스템에 저장된 정보 또는 데이터의 집합을 의미한다.
이러한 데이터베이스에는 크게관계형 데이터베이스(RDBMS)와 비 관계형 데이터베이스(NoSQL - Non relational database)이 있다. 이중에서 지금 다뤄볼 내용은 RDMBS에 관한 것이다.
관계형 데이터 베이스는 말 그대로 관계형 데이터 모델에 기초를 둔 데이터베이스 시스템이다.
각각의 table은 서로 상호연관성을 갖고 관계될 수 있다. 그 관계는 세가지 종류가 있다.
그리고 이 개념을 알기 위해서 필요한 것이 PK와 FK이다.
PK는 Primary Key라는 뜻으로 해당 table의 고유한 id이다. 각 row는 저마다의 PK를 가지고 있다! 주로 이 primary key를 통해서 해당 로우를 찾거나 인용/참조(reference)하게 된다. (--> FK와 연관됨)
위키피디아에서 정의하는 PK는 다음과 같다.
기본 키는 주 키 또는 프라이머리 키라고 하며, 관계형 데이터베이스에서 조의 식별자로 이용하기에 가장 적합한 것을 관계 마다 단 한 설계자에 의해 선택, 정의된 후보 키를 말한다. 0~1개 이상의 속성의 집합으로 볼 수 있다.
또한 PK는 id라고도 명칭한다.
FK는 Foriegn key를 의미하며 말 그대로 외래 키 이다.
앞서 PK의 인용/참조를 말하면서 FK와 연관되어 있다고 했는데 내가 이해한 것을 나의 말로 풀어쓰자면
"고유의 PK가 존재하는 table의 column으로 외부 table의 값을 가져올때, 그 외부 table의 PK를 가져오는데 이 외부 table의 각 PK는 참조하려는 table의 FK로 작용한다."
라고 할 수 있다. 보다 정확한 의미파악을 위해 위키피디아의 설명을 첨부한다.
- 관계형 데이터베이스에서 외래 키(외부 키, Foreign Key)는 한 테이블의 필드(attribute) 중 다른 테이블의 행(row)을 식별할 수 있는 키를 말한다.
- 외래 키는 참조하는 테이블에서 1개의 키(속성 또는 속성의 집합)에 해당하고, 참조하는 측의 관계 변수는 참조되는 측의 테이블의 키를 가리킨다. 참조하는 테이블의 속성의 행 1개의 값은, 참조되는 측 테이블의 행 값에 대응된다. 이 때문에 참조하는 테이블의 행에는, 참조되는 테이블에 나타나지 않는 값을 포함할 수 없다. 이러한 참조 관계는 2개의 테이블을 연관시키기 위한 관계 정규화의 본질적인 부분이다. 참조하는 테이블의 행 여러 개가, 참조되는 테이블의 동일한 행을 참조할 수 있다.
화살표는 FK에서 PF로 향한다. 말 그대로 이렇게 생각하면 된다.!!
그림과 같이 있을 때, user-pofiles 라는 table의 users_id 값은 FK 이다. 즉 여기에 어떤 실제적인 값 이 적히는 것이 아니라 users 라는 table의 PK 값이 들어서게 되는 것이다.
user_profiles의 users_id는 참조 하는 값 으로 users table의 값을 참조한다.!
즉
참조 함 (users_id) ---> 참조 됨 (users)
로 화살표가 향하게 된다.
화살표의 방향은 참조 하는 것 에서 참조 되는 것 으로 FK 에서 해당 FK에 부합되는 PK로 향한다.
PK와 FK의 개념을 바탕으로 관계형데이터베이스의 3가지 관계성을 공부하였다.
또한 AQueryTool 로 직접 틀을 만들면서 이해했다!
테이블 A의 로우와 테이블 B의 로우가 정확히 일대일 매칭이 되는 관계.
user_profile의 users_id 라는 column은 그 값으로 users 라는 table의 PK 값을 받는다.
한명의 유저에 대한 name과 password에 부합되는 profiles는 오직 하나이고, 반대로 하나의 profiles에 부합되는 user도 오직 하나, 즉 "일대일 매칭"의 예를 보여준다.
테이블 A의 로우가 테이블 B의 여러 로우와 연결이 되는 관계. (하나 & 여러개)
상황을 예시로 들면, users 에는 한 매장의 손님 이름이 적혀 있다. purcase 에는 product와 price, 그리고 해당 물건을 구입한 손님의 값이 들어갈 것이다.
이런 상황에서 한 손님은 사과를 살 수도 있지만 바나나를 살 수도 있다. user에 속한 손님 값 하나가 purchase에 속한 여러 값에 모두 들어갈 수 있다는 것이다.
위와 같은 관계성을 나타내는 표가 있는데 이의 내용을 가정하여 살펴보면.
이렇게 amanda가 apple과 banana를 구매하였는데 John도 apple을 구매하는 경우이다.
각 고객은 여러 제품을 구매할 수 있지만 구매된 제품의 주인은 오직 한 고객 뿐이다
즉, 참조 하는 table이 하나의 값이 참조 받는 table의 여러 값을 받을 때 one to many라고 한다.
테이블 A의 여러 로우가 테이블 B의 여러 로우와 연결이 되는 관계
작가와 출판 책의 이름에 관한 예를 들어 설명해보면 다음과 같다.

Amanda는 star 라는 책과 lovely_bear라는 책을 출판하였다. 그런데 이 lovely_bear는 공동저자로 출판되어 Tom 역시 저자이다.
즉, 한명의 저자가 여러권을 책을 출판하기도 하지만, 한권의 책은 여러명의 저자가 있기도 하다.
책은 여러 작가에 의해 쓰일 수 있고 작가들은 여러 책을 쓸 수 있다.
이를 table로 나타낼 땐 중간에 table이 하나 더 있어야 표현 가능하다.

이 중간 talbe에는 PK와 FK만 존재할 때도 있지만, 추가적인 column값을 부여할 수도 있다. (인세와 같은 요소가 추가될 수 있다.)
이처럼 한 테이블의 여러개 row가 다른 테이블의 여러개 row와 연결되는 관계를 many to many라고 한다.
이론 설명으로는 이해하지 못했었다. AQuery Tool을 통해 PK와 AK간의 관계성을 생각하고, table 간에 화살표를 이어주면서 이해하 수 있었다.!
참고하면서 이해하는데 확신이 들게 해준 자료 : https://velog.io/@matisse/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B4%80%EA%B3%84-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-One-to
끝 ~ 💕😊😊😊💕