[Section2] 데이터베이스 - 설계

2023. 5. 26. 15:51

🧑🏻‍💻 TIL(Today I Learned)


✔️ 스키마(shema), 데이터베이스 설계

 

💡스키마(shema)

➡️ 데이터베이스에서 데이터가 구성되는 방식과 서로 다른 엔티티 간의 관계에 대한 설명이라고 할 수 있음 

 

🔎 엔티티(Entity)

➡️ 고유한 정보의 단위, 데이터베이스에서 테이블로 표시할 수 있음

 

🔎 데이터베이스 관계 종류

1 : 1 관계

➡️ 하나의 레코드가 다른 테이블의 레코드 한 개와 연결된 경우

  • 각 전화번호가 단 한 명의 유저와 연결되어 있고 그 반대도 동일하다면 User 테이블과 Phonebook 테이블은 1 : 1 관계 
    → 하지만 자주 사용하지는 않음 

 

1 : N 관계

➡️ 하나의 레코드가 서로 다른 여러 개의 레코드와 연결된 경우 

  • 한 명의 유저가 여러 전화번호를 가질 수 있으나 여러 명의 유저가 하나의 전화번호를 가질 수 없음 
    → 관계형 데이터베이스에서 가장 많이 사용하는 관계

 

N : N(다대다) 관계

➡️ 여러 개의 레코드가 다른 테이블의 여러 개의 레코드와 관계가 있는 경우 

➡️ 다대다 관계를 위해 스키마를 디자인할 때는 Join 테이블 만들어 관리함

➡️ 1 : N 관계와 비슷하지만 양방향에서 다수의 레코드를 가질 수 있음 

  • 여러 개의 여행 상품이 있고 여러 명의 고객이 있다면 고객 한 명은 여러 개의 여행 상품을 구매할 수 있고 여행 상품 하나는 여러 명의 고객이 구매 가능함 
  • 위 사진에서 다대다 관계를 위한 테이블 customer_package 테이블을 조인 테이블이라고 함 
    → 이 테이블은 customer_id 와  package_id를 묶어주는 역할 
     조인 테이블을 생성하더라도 기본키는 반드시 있어야 함 
  • 만약 외래키를 리스트 형식으로 관리하는 필드가 있다면, 어떤 문제가 발생할 수 있을까요

 

자기 참조 관계(Self Referencing Relationchip)

➡️ 테이블 내에서 관계가 필요할 때 사용, 예를 들어 추천인이 누군지 파악하기 위해서 

  • user_id 는 기본 키, name 은 사용자 이름, recommend_id는 추천인 아이디
  • 한 명의 유저는 한 명의 추천인을 가질 수 있음 그러나 여러 명이 한 명의 유저를 추천인으로 등록 가능함 
  • 1 : N 관계와 유사하다고 생각할 수 있으나 일반적으로 일대다 관계는 서로 다른 테이블의 관계를 나타낼 때 표현하는 방법

 

💡 SQL 내장함수

✔️ 집합연산 : 레코드를 조회하고 분류한 뒤, 특정 작업을 하는 연산 

GROUP BY : 데이터를 조회할 때 그룹으로 묶어서 조회 

SELECT * FROM Customers;
GROUP BY State;

# 그룹은 지정했지만 그룹에 대한 작업없이 조회만 함 
# 쿼리의 결과로 나타나는 데이터는 각 그룹의 첫 번째 데이터만 표현됨

 

HAVING : GROUP BY로 조회된 결과를 필터링할 수 있음 

SELECT CustomerId, AVG(Total)
FROM invoices
GROUP BY CustomerId
HAVING AVG(Total) > 6.00

# invoices 테이블을 CustomerId로 그룹화하고 그 평균이 6을 초과한 결과 조회
  • 여기서 주의할 점은 HAVING과 WHERE은 적용하는 방식이 다르다는 것! 
    → HAVING은 그룹화한 결과에 대한 필터, WHERE은 저장된 레코드를 필터링
    → 실제로 그룹화 전에 데이터를 필터해야 한다면 WHERE 사용해야 함!

 

COUNT() : 레코드의 개수를 헤아릴 때 사용 

SELECT *, COUNT(*) FROM customers
GROUP BY State;
# 각 그룹의 첫 번째 레코드와 각 그룹의 레코드 개수를 집계하여 리턴 

SELECT State, COUNT(*) FROM customers
GROUP BY State;
# 각 State에 해당하는 레코드 개수를 확인

 

SUM() : 레코드의 합 

SELECT InvoiceId, SUM(UnitPrice)
FROM invoice_items
GROUP BY InvoiceId;
# InvoiceId 필드를 기준으로 그룹화하고, UnitPrice의 합을 구한다

 

AVG() : 레코드의 평균값을 계산

SELECT TrackId, AVG(UnitPrice)
FROM invoice_items
GROUP BY TrackId;

 

MAX(), MIN() : 각각 레코드의 최대값과 최소값 리턴

SELECT CustomerId, MIN(Total)
FROM invoices
GROUP BY CustomerId
# 최소값 리턴

SELECT CustomerId, MIN(Total)
FROM invoices
GROUP BY CustomerId
# 최대값 리턴

 

✔️ SELECT 실행 순서

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY

정리하고 올리는 걸 깜빡..... 

BELATED ARTICLES

more