[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 실행 순서
- FROM
- WHERE
- GROUP BY
- HAVING
- SELECT
- ORDER BY
정리하고 올리는 걸 깜빡.....
'SEB_BE_45 > 공부 정리' 카테고리의 다른 글
[Section2] Spring Framework 2 (0) | 2023.05.31 |
---|---|
[Section2] Spring Framework 1 (0) | 2023.05.31 |
[Section2] 데이터베이스 - SQL (0) | 2023.05.24 |
[Section2] 네트워크 - HTTP / 20230523 (0) | 2023.05.24 |
[Section2] 네트워크 - 웹 애플리케이션 작동 원리 / 20230522 (0) | 2023.05.22 |