CS/데이터베이스

    [CS - 데이터베이스] 데이터베이스의 정규화

    데이터베이스의 정규화 정규화(Normalization)란? 데이터베이스의 중복을 피하기 위해 데이터를 분해하고 구조화하는 작업. 중복이 많이 발생하면 이상 현상이 발생하기 때문에 정규화 작업을 해주어야 함! 정규화란 RDBMS에서 중복을 최소화하기 위해 데이터를 분해하는 작업을 말한다. 중복된 데이터를 만들지 않으면, 무결성을 유지하면서 이상 현상을 방지할 수 있고, DB 저장 용량 또한 효율적으로 관리할 수 있다. 또한, 테이블 구성을 논리적이고 직관적으로 할 수 있고, 데이터베이스 구조를 확장에 용이해진다. *이상 현상이란? 데이터의 중복이 많아서 데이터 처리가 잘 안 되는 경우를 말한다. 삽입 이상 : 원하지 않는 데이터 삽입되는 상황 || 데이터 삽입 시 관련 없는 데이터 추가 삽입해야하는 상황 ..

    [CS - 데이터베이스] Index를 Hash Table이 아닌, B+Table로 구현하는 이유

    Index를 Hash Table이 아닌, B+Table로 구현하는 이유 “Hash Table은 검색의 시간복잡도가 O(1)로, O(logn)인 B+Table보다 빠르다. 그럼에도 불구하고 왜 Index를 B+Table로 구현하는가?” 이 질문에 답하기 위해선, 우선 B+Table이 어떻게 구현되어 있는지 알아야 한다. 이 개념부터 살펴보자. B+Table 이란? 두 가지의 키워드로 요약할 수 있다. 정렬과 부등호. B+Table은 데이터를 정렬하여 저장하기 때문에 부등호 연산, 즉 범위 검색에 유용하다. 왜냐하면, B+Table의 각 노드에는 값과 범위가 저장되기 때문에, root 노드에서 시작해서 찾고자 하는 값의 범위에 맞는 노드를 탐색해나가는 원리이기 때문이다. *B+Table의 B는 Balance..

    [CS - 데이터베이스] Index에서 Column 사용 (또는 선정) 기준

    Index에서 Column을 선정하는 기준 DB에서 어떤 Column을 선정하느냐에 따라 다양한 Index를 만들 수 있다. 우리는 어떤 Column을 선정하는 것이 좋을까? 이 부분은 굉장히 빈번하게 나오는 내용이지만 개념은 간단하다. 그래서 결과부터 알아보고 그 이유를 살펴보자. Column 선정 기준 Index에서 사용하는 Column은 조회 빈도가 높아야 한다. 수정 빈도가 낮아야 한다. 카디널리티가 높아야 한다. 선택도가 낮아야 한다. 왜냐하면, Index가 SELECT ~ WHERE ~ 절이기 때문에 자주 쓰이는 것이어야 한다. 수정될 때마다 데이터가 재정렬되기 때문에 그 비용이 크면 안되기 때문이다. 카디널리티는 ‘얼마나 중복이 안되냐’, ‘얼마나 고유한 값이냐’를 말한다. 최대한 중복을 피..

    [CS - 데이터베이스] DB의 Index

    Index Index란? Index란 데이터베이스에서 테이블의 검색 성능을 높여주는 대표적인 방법 중 하나이다. 일반적인 관계형 데이터베이스(RDBMS)에서는 B+Tree 구조로 된 Index를 사용하여 검색 속도를 향상시킨다. Index를 활용한다면, SELECT ~ WHERE query를 통해 특정 조건을 만족하는 데이터를 찾을 때 Full Table Sacn할 필요 없이 정렬되어 있는 Index에서 훨씬 빠른 속도로 검색할 수 있게 된다. Index 구조 BTree, B+Tree, Bitmask, Hash 등으로 구현할 수 있지만, 일반적으로 B+Tree 구조로 구현한다. 구체적으로 Index가 어떻게 이루어져있냐면, 특정 column 값과 실제 데이터의 물리적 주소를 가리키는 pointer 값으로..

    [CS - 데이터베이스] Transaction과 Deadlock

    Transaction 개념 우선, Transaction의 개념부터 알아보자. 단어의 뜻은 거래∙처리 이다. 데이터베이스에서의 거래∙처리인 것이다. 즉, Transaction이란 데이터베이스 내에서 수행되는 작업의 최소 단위이고, 데이터베이스의 무결성을 유지하며 DB의 상태를 변화시키는 작업을 수행한다. 작업의 최소 단위라는 것은 어떤 말일까? 은행의 송금 업무를 예로 들어보자. 나와 철수는 각각 100만원을 가지고 있고, 나는 은행 앱으로 철수에게 10만원을 송금하려고 한다. 그런데 은행 점검 시간이 잘못 겹치는 바람에, 나는 송금을 해서 잔액이 90만원이 됐지만, 철수는 입금 작업이 처리가 안돼서 여전히 100만원이다. 왜 이런 상황이 발생했을까? 내가 철수에게 10만원을 송금한다는 작업이 내 잔액에서..

    [CS - 데이터베이스] RDB와 NoSQL

    RDB와 NoSQL 우리가 앞에서 배운 것들은 다 관계형 데이터베이스에 관한 설명이었다. 하지만, 요즘 NoSQL의 비중이 증가함에 따라 각각의 장단점을 잘 파악하고 있어야 적재적소에 맞게 사용할 수 있다. 두 개념을 비교하면서 알아보자! RDB 우선 RDB가 어떤 특징을 갖고 있는지부터 알아보자. RDB는 정형화된 틀을 통해 데이터를 저장하는 시스템이다. 철저히 구분된 틀이 있기 때문에 중복되는 값이 적다. 따라서 정보의 업데이트가 잦은 구조에 유리하다. 하지만, 너무 엄격한 틀이기 때문에 유연성이 적고, 확장성이 떨어진다. 단순히 수직적으로밖에 확장을 못한다. 따라서 변동성이 적은 정보에 유리하다. 많은 데이터를 처리하기 보단, 적은 데이터를 처리하는 데 유리하다. NoSQL NoSQL이 뭘까? No..

    [CS - 데이터베이스] RDB의 테이블 결합 (left outer join, inner join)

    RDB의 테이블 결합 (join) RDB에서 두 개의 테이블을 하나로 결합하여 보여주는 것을 join이라고 한다. join 중에서도 실무에 가장 많이 쓰이는 기법으로 left (outer) join, inner join이 있다. 이것이 어떤 것인지 비교하면서 살펴보자! join이란? join의 기법에 대해 말하기 전에, join이 어떤 개념인지 간략하게 짚고 넘어가자. join은 RDB에서 두 개 이상의 테이블을 하나의 결과로 (테이블로) 보여주는 것을 말한다. 이렇게 합치는 과정에서 두 테이블의 차이를 어떻게 할 것이냐에 대한 논의가 left join, inner join 이다. 이것 말고도 다양한 기법들이 존재한다! 위 두 표를 하나의 표로 나타내기 위해선 어떻게 할 수 있을까? left join 왼..

    [CS - 데이터베이스] 관계형 데이터베이스의 관계 (1:1, 1:N, N:M)

    RDB의 관계 RDB는 Relation DataBase로 관계형 데이터베이스를 말한다. 이 관계형 데이터베이스를 표현할 때 하나의 테이블로 표현을 하곤 하는데, 2개 이상의 데이터베이스(테이블)의 관계를 표현할 때 1:1, 1:N, N:M 이라고 표현한다. 각각 어떤 것을 의미하는지 예시와 함께 살펴보자! 1:1 관계 RDB에서 각 테이블의 요소가 서로만을 바라보고 있는 관계를 말한다. 예를 들면, 신랑 - 신부의 관계가 있다. 서로 하나만을 객체로 가진다. 1:N 관계 RDB에서 하나의 entity(table)이 관계를 맺고 있는 entity의 여러 객체를 가질 수 있는 구조를 말한다. 쉽게 말해서, 한 테이블의 각 객체들이 다른 테이블의 여러 객체를 가지는 경우를 말한다. 그리고 여기서 1에 속하는 ..