카테고리 없음

240710 TIL 오십여덟번째 - SQL 릴레이션 , JOIN

8나지 2024. 7. 10. 13:07

 

주제1  sql
작성이유 참고하기 위해 

 

문제상황

릴레이션  SQL 이 무엇이고 왜 필요한가요?
  • SQL 은 데이터베이스와 대화를 하기 위한 언어입니다.
  • 옆의 사람에게 필요한 것을 요청할 때 ‘A 를 주시겠어요?’ 와 하는 것과 같이 데이터베이스에게도 ‘A를 주겠니?’ 라고 이야기할 때 사용하는 언어라고 할 수 있습니다.
  • (Tip!) SQL 이란 언어를 이용하여 데이터베이스에 요청을 하는 질의를 ‘Query’ 라고 합니다. 강의에서도 데이터베이스에 요청을 할 때 Query 작성이라는 말을 사용 
테이블 관계에 대해서 알아보기 / 조인에 대해서 


테이블 관계 - 1:1 / 1:N / N:M


1:1 관계) users 테이블의 userid와
user infos 테이블의 주민번호 칼럼을 1:1 넣어줌 


1:N관계) 학생 : 학급
학생 입장에서 학급을 여러개 가질 수 있는가(학년으로 따진다면.. Y) N
학급 입장에서 학생을 여러명 가질 수 있는가 Y
=> 1:N (학년으로 따진다면 N:M)


2. 회원: 회원주소 
만약 배민 처럼 주소를 여러개 가질  있다면 1:N
2. 게시글 : 좋아요 이력 
1:N
게시글은 여러개의 좋아요를   있지만 좋아요는 게시글을 여러개 가질  없음 


N:M관계) 설정시 여러개를 가질 수 있는가? 를 기준으로 둘 것
학생 : 수업
학생 입장에서 수업을 여러개 들을 수 있는가 Y
수업 입장에서 학생을 여러명 가질 수 있는가 Y
=> N:M

JOIN 기본키  : 원하는 컬럼에 붙여주기
CREATE TABLE user {
id int PRIMARY KEY}
------
외래키 (기본키 설정 후)
FOREIGN KEY (country_id) REFERENCES country(country_id)
-> FK는 country_id 이고 이것은 country(country_id) 참조됨

외부키와 기본키는 1:1 매칭
-----
join : 필요한 데이터가 다른 테이블에 있을 때 데이터 불러오는 용도
필요한 것 : 공통으로 가지고 있는 컬럼
1:1, 1:N, N:M 상관 없음.
- 꼭 외래키를 해야 엮을 수 있진 않음. 단, 빨라서 자주사용함

LEFT JOIN : 공통 컬럼인 키값을 기준으로 하나의 테이블에 값이 없더라도 모두 조회함.
예를 들어

LEFT JOIN
select 조회 할 컬럼
from 테이블1 a left join 테이블2 b on a.공통컬럼명=b.공통컬럼명

이라면. 유저가 테이블 1. join 기준으로 왼쪽에 있으므로

RIGHT JOIN : 기준이 다를 뿐. LEFT JOIN과 같음
* 주의할 것 (자꾸 메인 ; 유저 등을 왼쪽에 두고 릴레이션이하는 것은.. 나만의 생각)

INNER JOIN
LEFT JOIN과 마찬가지로
select 조회 할 컬럼
from 테이블1 a inner join 테이블2 b on a.공통컬럼명=b.공통컬럼명

```tip```
공통 컬럼은 묶어주기 위한 공통값 이기 때문에 두 컬럼명이 다를 수도 있음
ex. 주문 정보에 고객id, 고객 정보에는 고객아이디 라고해도
테이블1.고객id=테이블2.고객아이디 처럼 묶는데는 상관 없음 .
---

## 그 외
join을 활용하여 테이블 값 연산시 :
- 어떤 테이블에서 데이터 뽑을지
- 어떤 칼럼 이용할지
- 어떤 조건 지정할지
- 어떤 함수, 수식 이용할지

순서도 (기억...해보기)
from -> join -> where(데이터 가져오기 전 상태) -> group by -> having (조건 가져온 후) -> select -> order by -> limit
 
@@를 활용하여 테이블 이름 지정하기
컬럼명 이름 붙여주는 것은 다를 때 위주로 (같으면 안붙여도 됨) ; ex. userId Int @map("user_id")
있을지 없을 지 모르는 컬럼은 []을 넣기 ex. reviews Review[]

`중복안되게 설정`

## 예시. 같은 펫시터가 같은 날에 중복예약 되지 않도록 설정

model Reservation {

id Int @id @default(autoincrement())

sitterId Int @map("sitter_id")

userId Int @map("user_id")

date DateTime

service ServiceType

createdAt DateTime @default(now()) @map("created_at")

updatedAt DateTime @updatedAt @map("updated_at")

petSitter PetSitter @relation(fields: [sitterId], references: [id])

user User @relation(fields: [userId], references: [id])

review Review?

##### @@unique([sitterId, date]) // 같은 펫시터가 같은 날에 중복 예약되지 않도록 설정

#### @@map("reservations")

#### }
해결방법 풀이 나의 언어로 (문제상황의 이유를 몰랐다면 여기서 작성하기)
   

 

무엇을 개발하느냐에 따라 관계를 정의해야한다. => 설계중요 & 단편적으로 생각않기

참고하면 좋을 자료 : https://hanamon.kr/%EA%B4%80%EA%B3%84%ED%98%95-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%84%A4%EA%B3%84-%EA%B4%80%EA%B3%84-%EC%A2%85%EB%A5%98/

 

관계형 데이터베이스 설계 (관계 종류 1:1 / 1:M / N:M ) - 하나몬

⚡️ 스키마(Schema) & 쿼리 디자인(Query Design) ❗️스키마(schema)란? 스키마란 데이터베이스를 구성하는 레코드의 크기, 키(key)의 정의, 레코드와 레코드의 관계, 검색 방법 등을 정의한 것을 말한다

hanamon.kr

 

pk / fk 참고하면 좋을 자료 : https://velog.io/@hiy7030/DB-Primary-key%EC%99%80-foreign-key

 

[DB] Primary key와 foreign key

데이터베이스 테이블 내의 모든 레코드에서 고유한 아이디를 제공한다. 1\. 모든 레코드가 서로 다른 값을 가지고 있어 각 레코드를 식별할 수 있다.2\. NULL값이 존재할 수 없다. 3\. 레코드의 값은

velog.io