데이터베이스 - 관계형 데이터베이스 보충 내용

2021. 11. 15. 16:49·SE Bootcamp 내용 정리

데이터베이스 보충 내용 1

데이터베이스 정규화(Database Normalization)

데이터베이스 정규화는 데이터베이스 설계와 관련
→ 어떻게 설계하느냐에 따라 데이터가 어떻게 저장될지 등 그 구조가 결정됨

 

다음 3가지 부분을 잘 고려해야 한다

* Data Redundancy(데이터 중복)

* Data Integrity(데이터 무결성)

* Anomalry(이상 현상)

 

Data Redundancy(데이터 중복)

실제 데이터의 복사본이나, 부분적인 복사본 둘 다 포함하는 뜻
→ 데이터베이스 내에 중복이 있을 시 발생할 수 있는 문제점

* 일관된 자료 처리의 어려움(일관성 측면)
* 저장 공간 낭비
* 데이터 효율성 감소

 

Data Integrity(데이터 무결성)

데이터의 수명 주기 동안 정확성과 일관성을 유지하는 것을 뜻함
→ 데이터가 오염되지 않고, 입력된 그대로 데이터를 사용할 수 있다

 

데이터 정규화는 데이터 무결성을 강화시킴

 

Anomalry(이상 현상)

데이터 이상 현상은 기대한 데이터와 다른 이상 현상을 말함

다음의 3가지 이상 현상이 있다

* 갱신 이상(update anomalry)
* 삽입 이상(insertion anomalry)
* 삭제 이상(deletion anomalry)

 

Update Anomalry(갱신 이상)

여러 행(레코드)에 걸쳐 동일한 데이터가 있을 때, 어떤 행을 갱신해야 하는지 논리적인 일관성이 없는 경우에 발생
아래의 경우와 같이 두 개의 레코드(행)이 동일한 사람일 때, 해당 Employee ID의 레코드를 갱신하는 경우 어느 레코드의 데이터를 갱신할지 알 수 없음

Insertion Anomalry(삽입 이상)

데이터를 삽입하지 못하는 경우를 말한다
아래의 경우 Course Code를 Null값으로 지정하지 않는 이상, Course Code가 있어야만 테이블에 추가할 수 있는 이상 현상이 발생함

deletion anomalry(삭제 이상)

데이터의 특정 부분을 삭제할 때, 의도치 않게 다른 부분도 함께 지우는 이상 현상
어느 한 직원이 담당하는 Couse Code를 삭제하려고 할 때, 이를 삭제하려면 레코드(행) 전체가 삭제됨
→ 즉, 다른 데이터들(Faculty Name, Faculty ID, …) 들도 의도치 않게 삭제되는 현상이 발생

SQL의 종류

SQL의 문법은 다양하게 있는데, 쿼리문을 어떻게 작성하느냐에 따라 그 기능이나 작업이 달라짐
→ 역할에 따른 문법 분류

* Data Definition Language(DDL)

* Data Manipulation Language(DML)

* Data Control Language(DCL)

* Data Query Language(DQL)

* Transaction Control Language(TCL)

 

Data Definition Language(DDL)

DDL은 데이터를 정의할 때 사용하는 언어
→ 주로, 데이터베이스의 테이블과 같은 오브젝트를 정의할 때 사용

ex) CREATE, DROP, …

 

Data Manipulation Language(DML)

DML은 데이터베이스에 데이터를 저장할 때 사용하는 언어

ex) INSERT, DELETE, UPDATE, …

 

Data Control Language(DCL)

DCL은 데이터베이스에 대한 접근 권한과 관련된 문법
→ 어느 유저가 데이터베이스에 접근할 수 있는지 권한 설정

* GRANT: 권한을 수여

* REVOKE: 권한을 몰수

 

Data Query Language(DQL)

DQL은 정해진 스키마 내에서 쿼리(조회)하는 언어
→ 보통 DML의 일부분으로 포함시키기도 함

ex) SELECT

 

Transaction Control Language(TCL)

TCL은 DML을 거친 데이터의 변경사항을 수정할 수 있는 언어

* COMMIT: `DML`이 작업한 내용을 데이터베이스에 커밋

* ROLLBACK: 커밋했던 내용을 다시 롤백

 

SQL 심화 문법

CASE

SQL에서도 프로그래밍 언어의 if 문과 같은 기능 사용이 가능
→ CASE: 특정 조건에 따라 다른 결과를 받을 수 있음

//ex) case의 예시

SELECT CASE
            WHEN CustomerId <= 25 THEN 'GROUP 1'
            WHEN CustomerId <= 50 THEN 'GROUP 2'
            ELSE 'GROUP 3'
        END
    FROM customers

//  CustomerId 필드값에 따라 3개의 그룹으로 나눔

 

SUBQUERY

쿼리문을 작성할 때, 내부에 다른 쿼리문(서브쿼리)을 포함할 수 있다
→ 서브쿼리는 소괄호()로 감싸야 한다

 

서브쿼리의 결과는 개별 값이나 레코드 리스트이다
→ 그 서브쿼리의 결과를 하나의 칼럼으로 사용할 수 있음

// 서브쿼리의 예시

SELECT CustomerId, CustomerId = (SELECT CustomerId FROM customers WHERE CustomerId = 2)
FROM customers
WHERE CustomerId < 6

 

이러한 서브쿼리를 활용하는 방법은 다음과 같다

IN, NOT IN

IN을 통해 특정한 값이 서브쿼리에 있는지 확인(NOT IN은 반대)

SELECT *
FROM customers
WHERE CustomerId IN (SELECT CustomerId FROM customers WHERE CustomerId < 10)

// 서브쿼리에서  CustomerId가 10이하인 데이터를 돌려주므로, 최종 조회되는 데이터도
// 마찬가지로 10이하의 데 이터만 조회됨

 

EXISTS, NOT EXISTS

돌려받은 서브쿼리에 존재하는 레코드를 확인(EXISTS)
→ 리턴값은 true / false이다(존재하면/ 존재하지 않으면)

SELECT EmployeeId
FROM employees e    // 조건을 만족하는 레코드(EmployeeId)를 출력 해줌
WHERE EXISTS (    // 해당 서브쿼리의 조건을 만족하는 레코드가 있다면(true)
    SELECT 1
    FROM customers c
    WHERE c.SupportRepId = e.EmployeeId
    )
ORDER BY EmployeeId

 

FROM

FROM 에서도 서브쿼리를 사용할 수 있다

SELECT *
FROM (
    SELECT CustomerId
    FROM customers
    WHERE CustomerId < 10
    )

 

웹사이트 셋업과 관련된 SQL 치트 시트 레퍼런스

웹사이트 생성시 참조하기 좋은 SQL문 레퍼런스

https://websitesetup.org/wp-content/uploads/2020/08/SQL-Cheat-Sheet-websitesetup.pdf


데이터베이스 보충 내용 2

인스타그램 스키마 디자인하기

tip: 구현하려는 기능 단위별로 나눠서 생각하며 짜면 좀 더 수월하다

 

유저(user)와 팔로우(follow) 테이블의 관계?

user와 follower는 다대다(N:N) 관계이다

나는 여러 명을 팔로우할 수 있고, 그 팔로워들도 여러 명을 팔로우할 수 있다

// 팔로우의 팔로워 부분만 생각한 예

users            follow_follower
======          ========
id        (1)   id
username        *user_id
password        *follower_id

포스트(post)와 해시태그(hashtag) 간 관계?

하나의 포스트는 여러 개의 해시태그를 달 수 있고, 해시태그도 여러 개의 포스트를 내용으로 가질 수 있음
→ N:N 관계
→ join table이 필요함!


posts            posts_hashtags        hashtags
======            ======                ======
id        (1)     id                    (1)id
image            *hashtag_id
message          *post_id
…
user_id

 

포스트와 좋아요의 관계? 포스트와 댓글의 관계?

하나의 포스트에는 여러 개의 좋아요, 댓글을 달 수 있다
→ 각각, 1:N의 관계를 가짐


CRUD

Create

김코딩이 박코딩을 팔로우하는 예시

INSERT INTO follow_follower(user_id, follower_id)
VALUES (SELECT id FROM users WHERE username=”김코딩”,
SELECT id FROM users WHERE username=”박코딩”);

join을 이용해도 되지만 코드 간결성을 위해 subquery를 이용하면 더 좋다

 

Update

1번 유저가 21번 포스팅에 달았던 코멘트를 ‘hell, word’로 수정하는 예시

UPDATE post_comments
SET comment=’hell, word’
WHERE user_id=1 AND post_id=21;

 

Delete

21번 포스팅에 달린 #맞팔 해시태그를 삭제하는 예시


DELETE FROM posts_hashtags
WHERE posts_id =21 AND 
hashtag_id=(SELECT id FROM hashtags WHERE name=”맞팔”);

 

서브쿼리를 이용하면 편함!

저작자표시 (새창열림)

'SE Bootcamp 내용 정리' 카테고리의 다른 글

데이터베이스 - MVC 패턴 연습  (0) 2021.11.19
데이터베이스 - MVC 패턴 기초  (0) 2021.11.16
자료구조/알고리즘 - 중복 순열/순열/조합, DP의 알고리즘 예시  (0) 2021.11.15
자료구조/알고리즘 - 정규표현식  (0) 2021.11.11
자료구조/알고리즘 - 코딩 테스트 2  (0) 2021.11.11
'SE Bootcamp 내용 정리' 카테고리의 다른 글
  • 데이터베이스 - MVC 패턴 연습
  • 데이터베이스 - MVC 패턴 기초
  • 자료구조/알고리즘 - 중복 순열/순열/조합, DP의 알고리즘 예시
  • 자료구조/알고리즘 - 정규표현식
레실이
레실이
  • 레실이
    레실이의 티스토리
    레실이
  • 전체
    오늘
    어제
    • 분류 전체보기 (91)
      • SE Bootcamp 내용 정리 (63)
      • 알고리즘 연습 (7)
      • Project 주저리 (4)
      • 기술 면접 source (3)
      • 개발 일상 (12)
      • 생성 AI 활용 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    객체
    fastapi
    ubuntu
    DOM
    자료구조
    ORM
    PickAndDrink
    react
    promise
    CSR
    IT
    Python
    비동기
    state
    Linux
    알고리즘
    useRef
    인증/보안
    mongoDB
    데이터베이스
    JS
    node
    useState
    CSS
    Ajax
    node.js
    CORS
    MVC
    JavaScript
    문자열
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
레실이
데이터베이스 - 관계형 데이터베이스 보충 내용
상단으로

티스토리툴바