본문 바로가기

백엔드(Back End)/DataBase13

[TIL]20230801 - DB 인덱스 인덱스는 데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 저료구조이다. 특정 컬럼에 대해 인덱스를 생성하면 해당 컬럼의 데이터들을 정렬하여 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장된다. 인덱스는 여러 자료구조를 이용해서 구현할 수 있는데, 대표적인 자료구조로 해시 테이블과 B+ Tree가 있다. 인덱스를 사용하면 조회 속도는 빨라지지만 UPDATE, INSERT, DELETE의 속도는 저하된다는 단점이 있다. (Table의 Index 색인 정보를 갱신하는 추가적인 비용 소요, 정렬 떄문에) 때문에 효율적인 인덱스 설계로 단점을 최대한 보완하는 방법을 생각해볼 수 있다. 인덱스는 하나 혹은 여러개의 컬럼에 대해 설정할 수 있는데 이 때 WHERE절을 사용하지 않고 인덱스가 걸린 컬럼을.. 2023. 8. 2.
[TIL]20230731 - DB 정규화 DB정규화의 목표는 테이블 간 중복된 데이터를 허용하지 않음으로써 무결성을 유지하고 DB의 저장 용량을 줄이는데 있다. 이러한 정규화에는 단계가 정의되어있는데 테이블을 어떻게 분해하는지에 따라 정규화 단계가 달라진다. 제1 정규화 제1 정규화한 테이블의 컬럼이 원자값을 갖도록 테이블을 분해하는 것이다. 예를들어 다음과 같은 테이블이 존재할 때 추신수, 박세리는 여러 취미를 가지고 있기 때문에 제1 정규화를 만족하지 못한다. 때문에 제1 정규화를 거치면 다음과같이 테이블이 변한다. 제2 정규화 제2 정규화란 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다. 완전 함수 종속이란 기본키의 부분집합이 결정자가 되어선 안된다는 것이다. 위 테이블에서 기본키는 (학생번호, .. 2023. 7. 31.
DB 트랜잭션(Transaction) 트랙잭션이란? 데이터 베이스의 상태를 변화시키기 위해 수행하는 하나의 논리적 작업단위를 구성하는 일련의 연산들의 집합 ex) 한계좌에서 10만원을 인출하여 다른계좌로 10만원 입금하는 경우 전체작업이 정상적으로 완료되거나, 만약 정상적으로 처리될 수 없는 경우에는 아무것도 실행되지 않은 처음 상태로 되돌려뎌야한다. 트랜잭션의 성질 원자성: 트랜잭션의 모든 연산들이 정상적으로 수행완료되거나 아니면 전혀 어떠한 연산도 수행되지 않은 상태를 보장해야한다.(더이상 쪼갤 수 없다.) 일관성: 트랜잭션의 작업 처리 결과는 항상 일관성이 있어야한다. 독립성: 둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 때, 어떤 트랜잭션도 다른 트랜잭션에 끼어들 수 없다. 지속성: 트랜잭션이 성공적으로 완료되었으면, 결과는 영구.. 2023. 6. 19.
SQL(4)-COALESCE함수에 대해 정확히 알아보기 1. 개요 https://school.programmers.co.kr/learn/courses/30/lessons/131114 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 프로그래머스 SQL문제를 풀던 중 해당값이 NULL일때 NULL으로 나타내는것이 아닌 'N'으로 나타내라는 문제를 만났다. 이런 상황을 만나본적이 없어 검색을 통해 COALESCE(freezer_yn, 'N')을 사용하여 컬럼 freezer_yn이 NULL이 아니라면 그대로 반환하고 만약 NULL이라면 'N'을반환하는 방식으로 문제를 해결하였다. 처음보는 함수였기에 항해99 개강 준비.. 2023. 6. 6.
SQL(3)-JOIN 1. JOIN이란? 두 테이블의 공통된 정보(key)를 기준으로 테이블을 연결애서 한 테이블처럼 보는것 예를들어 a라는 강의를 수강 등록한사람의 이메일이 필요할때 수강 등록 정보를 담고있는 테이블 enrolleds에는 user_id라는 필드는 있지만 그 유저의 이메일은 가지고있지 않다. 회원 정보를 담고있는 테이블 users에는 user_id와 이메일 필드 모두 있다. JOIN을 사용하지 않는다면 enrolleds 테이블에서 a라는 강의를 수강하는 레코드의 user_id를 users테이블에서 where문을 사용해 이메일 정보를 얻어야한다. 하지만 JOIN문을 사용하여 두 테이블을 합친다면 두 테이블이 user_id를 기준으로 연결되어 where문을 사용한다면 a라는 강의를 수강하는 모든 유저의 이메일을 .. 2023. 6. 2.
SQL(2)-GROUP BY, ORDER BY 1. 유의미한 정보 이전 SELECT와 WHERE을 이용해 우리는 데이터를 가져왔지만 우리가 가져온것은 가공되지 않은 데이터의 날것 그 자체이다. 우리는 그 데이터를 가공하여 우리가 원하는 유의미한 정보(최대, 최소, 평균, 개수)를 가져올수 있다. 이때 전체데이터의 정보 뿐 아니라 좋아요 갯수 등 특정 범주에서의 정보또한 가져와야할수 있다. 예를 들어 성이 "이"인 회원수가 궁금하다면 SELECT COUNT(*) FROM users WHERE name = "이**" 을 통해 구할수 있겠지만 성씨별 회원수를 구하려 한다면 존재하는 성씨의 수 만큼 쿼리를 작성해야한다. 이때 GROUP BY를 통해 통일한 범주의 데이터를 묶어 가져올 수 있다. 2. GROUP BY 2-1 GROUP BY를 이용해 범주별 갯.. 2023. 6. 1.