본문 바로가기
프로그래밍/CS

CS스터디 8주차 - 데이터베이스(DB) 1/2

by 숙님 2023. 4. 27.
728x90

7주차 후기 

오늘도 스터디원들이 바빠서 나포함 2명이서 진행했다 

함께한 분이 현직자이시고 아시는 것이 많아서 많이 배울 수 있었다

구글 주소를 검색창에 검색하면 나타나는 과정 요약 짤


데이터 베이스 종류와 특징

데이터 베이스를 사용하는 이유

  1. 데이터의 중복을 방지하여 일관성을 유지합니다.
  2. 데이터를 보호하고 보안을 유지합니다.
  3. 데이터의 공유 연동이 용이합니다.
  4. 대량의 데이터를 효율적으로 처리할 있습니다.
  5. 데이터 분석 검색이 용이합니다.

성능(좋게하는 법) 

  1. 적절한 하드웨어 선택: 데이터베이스 서버의 용량, 메모리, 디스크, 네트워크 대역폭 등의 하드웨어 요소는 데이터베이스의 성능에 직접적인 영향을 미칩니다. 적절한 하드웨어를 선택하고 구성하여 데이터베이스의 성능을 향상시키는 것이 중요합니다.
  2. 적절한 인덱싱: 인덱스는 데이터베이스에서 검색과 질의를 빠르게 처리하는 필요한 구성 요소입니다. 적절한 인덱스를 설정하면 쿼리 성능이 향상됩니다.
  3. 적절한 쿼리 작성: 데이터베이스 성능을 향상시키기 위해서는 최적화된 쿼리를 작성해야 합니다. 쿼리 성능을 향상시키는 방법으로는 쿼리 튜닝, 조인 최적화, 인덱스 최적화, 부하 분산 등이 있습니다.
  4. 적절한 데이터베이스 디자인: 데이터베이스 디자인은 데이터의 무결성과 일관성을 유지하는 중요합니다. 적절한 데이터베이스 디자인을 통해 데이터 중복을 방지하고, 쿼리의 성능을 향상시킬 있습니다.
  5. 적절한 캐싱 버퍼링: 캐시와 버퍼링은 데이터베이스 성능을 향상시키는 중요한 역할을 합니다. 캐싱과 버퍼링을 사용하면 빈번한 디스크 액세스를 줄일 있어 데이터베이스의 응답성과 처리 속도를 향상시킬 있습니다.
  6. 적절한 보안 권한 관리: 데이터베이스 보안 권한 관리는 데이터의 무결성과 안전을 보장하는 중요합니다. 데이터베이스 사용자와 권한을 적절하게 관리하여 데이터베이스 성능을 유지하고 보안을 강화할 있습니다.

특징

  1. 데이터의 일관성을 유지합니다.
  2. 데이터의 무결성을 보장합니다.
  3. 데이터의 보안을 유지합니다.
  4. 데이터의 동시성을 제공합니다.
  5. 데이터의 효율적인 저장과 검색을 제공합니다.

데이터 베이스 언어

데이터베이스는 SQL (Structured Query Language)이라는 표준 언어를 사용합니다. SQL 데이터베이스를 조작하고 쿼리하는 사용됩니다. SQL 문은 대개 DDL (Data Definition Language), DML (Data Manipulation Language) DCL (Data Control Language) 구성됩니다.

 

DDL, DML, DCL

  1. DDL 데이터베이스의 구조를 정의하고 변경합니다.
  2. DML 데이터를 삽입, 수정, 삭제하는 사용됩니다.
  3. DCL 데이터에 대한 액세스 권한을 관리합니다.

RDMS 설명

관계형 데이터베이스 관리 시스템 (RDBMS) 데이터를 테이블 형식으로 저장하고 SQL 사용하여 데이터를 쿼리하는 사용됩니다. RDBMS ACID (원자성, 일관성, 고립성, 지속성) 속성을 준수합니다. 일반적인 RDBMS에는 MySQL, Oracle Microsoft SQL Server 있습니다.

 

NoSQL 설명

NoSQL "not only SQL" 약자로, 관계형 데이터 모델이 아닌 다른 데이터 모델을 사용하는 데이터베이스를 의미합니다. NoSQL 데이터베이스는 대량의 비정형 데이터를 처리하고 확장성과 가용성을 높이기 위해 설계되었습니다. NoSQL ACID 속성을 준수하지 않지만, CAP 이론을 따릅니다.

 

CAP 이론

CAP 이론은 일관성 (Consistency), 가용성 (Availability), 분할 내성 (Partition tolerance) 중에서 가지만 선택할 있다는 이론입니다. NoSQL 데이터베이스는 대부분 가용성과 분할 내성을 선택합니다.

 

저장 방식에 따른 NoSQL 분류

  1. Document-oriented databases: 문서 형식으로 데이터를 저장합니다. 예시로는 MongoDB 있습니다.
  2. Key-value stores: key-value 쌍으로 데이터를 저장합니다. 예시로는 Redis, Riak 있습니다.
  3. Column-family stores: 컬럼 기반으로 데이터를 저장합니다. 예시로는 Apache Cassandra 있습니다.
  4. Graph databases: 그래프 형태로 데이터를 저장하고 관리합니다. 예시로는 Neo4j 있습니다.

RDBMS와 NoSQL의 차이에 대해 설명해주세요.

RDBMS NoSQL 가장 차이점은 데이터 모델입니다. RDBMS 관계형 데이터 모델을 사용하며, 데이터는 테이블에 행과 열로 저장됩니다. 이에 반해, NoSQL 데이터베이스는 관계형 데이터 모델을 사용하지 않습니다. NoSQL 데이터베이스는 대부분 수평적으로 확장할 있으며, 대량의 비정형 데이터를 처리하는 최적화되어 있습니다.

RDBMS ACID (원자성, 일관성, 고립성, 지속성) 속성을 준수하는 데이터베이스이며, 데이터 일관성과 무결성을 보장합니다. 이에 반해, NoSQL 데이터베이스는 CAP (일관성, 가용성, 분할 내성) 이론을 따르며, 대부분 일관성보다 가용성과 분할 내성을 우선시합니다.

 

그렇다면 RDBMS와 NoSQL은 어느 경우에 적합한가요?

RDBMS 복잡한 관계를 가진 데이터를 처리하는 적합하며, 안정성과 높은 일관성이 요구되는 시스템에 사용됩니다. 반면에, NoSQL 대규모 데이터 처리와 빠른 응답성이 요구되는 시스템에 적합합니다. 또한, 데이터 모델의 변경이 빈번하게 발생하는 경우에도 유연하게 대처할 있습니다. 예시로는 소셜 네트워크, 로그 분석, 인터넷 게임 등이 있습니다.


키란

(key) 데이터베이스에서 데이터를 구분하고 식별하기 위한 (column) 또는 열의 조합으로, 데이터의 무결성(integrity) 유지하기 위해 중요한 역할을 합니다.

 

사용 이유

  1. 데이터베이스의 무결성을 보장하기 위해 사용합니다.
  2. 데이터의 검색과 질의를 빠르게 처리하기 위해 사용합니다.

키종류

  1. 후보키(Candidate Key)
  2. 기본키(Primary Key)
  3. 대체키(Alternate Key)
  4. 슈퍼키(Super Key)
  5. 외래키(Foreign Key)

이름, 특징, 조건 설명 ( + null 값 가능 여부 )

Candidate Key (후보키)

  • 테이블에서 각 행(row)을 유일하게 식별할 수 있는 열 또는 열의 조합입니다.
  • 후보키는 중복이 없고, NULL 값을 가질 없습니다.

Primary Key (기본키)

  • 후보키 중에서 특정한 열을 선택한 것입니다.
  • 각 행(row)을 유일하게 식별할 수 있는 열 또는 열의 조합으로, 중복이 없고 NULL 값을 가질 수 없습니다.
  • 테이블에서 기본키는 하나만 존재할 있습니다.

Alternate Key (대체키)

  • 후보키 중에서 기본키를 제외한 나머지 후보키입니다.
  • (row) 유일하게 식별할 있는 또는 열의 조합으로, 중복이 없고 NULL 값을 가질 없습니다.

Super Key (슈퍼키)

  • 각 행(row)을 유일하게 식별할 수 있는 열 또는 열의 조합입니다.
  • 슈퍼키는 후보키가 수도, 아닐 수도 있습니다.

Foreign Key (외래키)

  • 다른 테이블의 기본키를 참조하는 열입니다.
  • 외래키를 사용하여 두 테이블 간의 관계를 형성하고 데이터의 무결성을 유지할 수 있습니다.
  • NULL 값을 가질 있습니다.

인덱스

Index에 대해 설명

Index(인덱스) 데이터베이스에서 데이터를 검색할 빠른 속도로 검색하기 위해 사용되는 자료구조입니다. 인덱스를 생성하면 데이터베이스는 인덱스를 사용하여 데이터를 검색하므로, 전체 데이터를 검색하는 것보다 효율적으로 검색할 있습니다.

 

장/단점

장점:

  • 데이터를 빠르게 검색할 수 있습니다.
  • 검색 속도를 향상시킬 수 있습니다.
  • 데이터베이스의 무결성을 보장할 수 있습니다.

단점:

  • 인덱스를 생성하면 데이터베이스의 용량이 증가하며, 저장 공간이 필요합니다.
  • 인덱스를 관리하기 위해 추가적인 자원이 필요합니다.
  • 인덱스를 잘못 사용하면 오히려 검색 속도가 느려질 있습니다.

DBMS는 Index를 어떻게 관리하고 있나요? (Index 자료구조에 대해 설명해주세요)

DBMS는 인덱스를 관리하기 위해 B+Tree나 해시 테이블과 같은 자료구조를 사용합니다.

B+Tree 인덱스 자료구조는 많이 사용되며, 이는 인덱스를 구성하는 키와 그에 대응하는 레코드의 위치를 정렬된 형태로 저장합니다. B+Tree 인덱스는 데이터베이스의 블록 단위로 구성되며, 블록은 인덱스 키와 레코드의 위치를 저장합니다. 자료구조는 검색 속도가 빠르고, 범위 검색에도 유용합니다.

해시 테이블은 인덱스 키를 해시 함수를 사용하여 해시 값으로 변환하고, 이를 이용하여 데이터를 검색하는 자료구조입니다. 해시 테이블은 검색 속도가 매우 빠르지만, 범위 검색이나 부분 검색에는 적합하지 않습니다.

 

B+Tree 인덱스 자료구조

  • B+Tree 인덱스는 모든 노드가 정렬된 상태를 유지하며, 키 값을 이용하여 노드를 검색합니다. 이 때, 키 값은 중복되지 않아야 합니다.
  • B+Tree 인덱스는 데이터가 추가, 수정, 삭제될 때마다 인덱스를 유지해야 하므로, 인덱스를 관리하는 오버헤드가 발생합니다.
  • B+Tree 인덱스는 범위 검색에 대한 성능이 우수합니다.

해시 테이블

해시 테이블은 키와 값을 쌍으로 저장하며, 값에 대한 해시 함수를 이용하여 값을 검색합니다. 해시 함수는 값을 해시 테이블의 인덱스로 변환해주는 역할을 합니다. 해시 테이블은 빠른 검색 속도를 제공하지만, 데이터의 추가, 수정, 삭제에 대한 성능이 떨어집니다. 또한, 해시 테이블은 범위 검색에 대한 성능이 미비합니다.

  • 해시 테이블은 해시 함수를 사용하여 검색 속도가 빠릅니다.
  • 해시 테이블은 데이터의 추가, 수정, 삭제에 대한 성능이 떨어집니다.
  • 해시 테이블은 범위 검색에 대한 성능이 미비합니다.
  • 해시 테이블은 중복된 값을 저장할 없습니다.

왜 index 를 생성하는데 b-tree 를 사용하는가?

  • 범위 검색이 가능합니다.
  • 데이터 정렬이 가능합니다.
  • 데이터 추가/삭제 작업이 빠릅니다.

Primary Index vs Secondary Index

1. Primary Index

  1. 기본키를 기반으로 생성되는 인덱스입니다.
  2. 데이터를 빠르게 검색할 수 있으며, 데이터의 무결성을 보장합니다.

2. Secondary Index

  • 기본키가 아닌 열을 기반으로 생성되는 인덱스입니다.
  • 데이터를 빠르게 검색할 있지만, Primary Index보다 검색 속도가 느릴 있습니다.

 

Composite Index

Composite Index 이상의 컬럼을 대상으로 인덱스를 생성하는 것을 말합니다. , 여러 개의 컬럼을 하나의 인덱스로 묶어서 관리하는 것입니다.

장점 

  • 여러 개의 컬럼을 하나의 인덱스로 묶어서 사용하므로, 복수의 조건을 사용한 쿼리에서 빠른 검색이 가능합니다.
  • 인덱스를 두 개 이상 사용할 때, 인덱스 사이즈가 작아져서 메모리를 적게 차지하게 됩니다.
  • 인덱스를 하나만 사용할 때보다 검색 속도가 빠릅니다.

단점 

  • 인덱스를 생성할 때, 컬럼이 많을수록 인덱스 생성 시간이 오래 걸립니다.
  • 인덱스를 생성할 , 인덱스 사이즈가 커지므로 디스크 공간을 많이 차지하게 됩니다.

Index 의 성능과 고려해야할 사항

  • Index를 사용하는 경우, 조회 성능은 높아지지만 삽입, 수정, 삭제 성능은 저하될 수 있습니다.
  • Index를 사용할 때는 데이터 분포도를 고려해야 합니다. 데이터 분포가 균일하지 않은 경우, Index를 사용해도 효과가 미비할 수 있습니다.
  • Index를 너무 많이 사용하면 메모리 부족 현상이 발생할 수 있습니다. 따라서 Index를 사용할 때는 신중하게 선택해야 합니다.
  • Index 생성할 때는 쿼리에서 자주 사용하는 컬럼을 우선적으로 고려해야 합니다.

정규화 

정규화는 어떤 배경에서 생겨났는가?

정규화는 데이터베이스 설계의 기법으로, 데이터의 중복을 최소화하고 이상 현상을 방지하기 위해 관계형 데이터베이스의 테이블을 분해하는 과정을 말합니다.

 

이상 현상의 종류에 대해 설명해주세요.

이상 현상은 데이터를 조작할 예상치 못한 결과가 발생하는 현상을 말합니다. 이상 현상은 크게 삽입 이상, 갱신 이상, 삭제 이상으로 구분됩니다.

 

삽입 이상

삽입 이상은 테이블에 새로운 데이터를 삽입할 , 원하는 데이터가 모두 삽입되지 않아 원하는 데이터를 저장할 없는 경우를 말합니다

 

갱신 이상

갱신 이상은 테이블에서 일부 데이터를 갱신할 , 일부 데이터만 갱신되어 데이터의 불일치가 발생하는 경우를 말합니다. 

 

삭제 이상

삭제 이상은 테이블에서 일부 데이터를 삭제할 , 해당 데이터와 관련된 다른 데이터도 함께 삭제되어 정보의 손실이 발생하는 경우를 말합니다.

 

정규화에 대해 설명해주세요.

정규화는 이상 현상을 방지하고 데이터 중복을 최소화하기 위해 테이블을 분해하는 과정입니다. 정규화를 수행하면 각각의 테이블이 하나의 주제에 집중하게 되고, 데이터의 중복이 감소하여 데이터베이스의 성능이 향상됩니다. 그러나 테이블의 수가 증가하고, 데이터 간의 관계를 파악하기 어려워지며, 조인 등의 작업이 복잡해질 있습니다.

 

‘나쁜' 릴레이션은 어떻게 파악하는가?

나쁜' 릴레이션은 중복 데이터, 삽입 이상, 갱신 이상, 삭제 이상 등을 가지고 있는 릴레이션입니다. 이러한 문제를 가지고 있는 릴레이션은 정규화를 수행하여 문제를 해결할 있습니다.

 

함수적 종속성이란 무엇인가?

함수적 종속성은 어떤 테이블에서 하나의 속성 또는 속성 집합이 다른 속성 또는 속성 집합을 유일하게 결정하는 관계를 말합니다. 예를 들어, 학생 테이블에서 학번이 주민등록번호를 유일하게 결정하는 경우, 학번은 주민등록번호에 함수적으로 종속됩니다.

 

정규화 종류

  1. 1 정규형 (1NF)
  2. 2 정규형 (2NF)
  3. 3 정규형 (3NF)
  4. 보이스-코드 정규형 (BCNF)
  5. 4NF
  6. 5NF

제 1 정규형 만족 조건 

  • 모든 도메인이 원자 값 (Atomic value)으로 되어 있어야 합니다.
  • 한 컬럼에 여러 개의 값이 들어 있으면 안됩니다.
  • 컬럼명과 데이터가 1:1 대응되어야 합니다.

제 2 정규형 만족 조건 

  • 제 1 정규형을 만족해야 합니다.
  • 모든 컬럼이 완전 함수적 종속성 (Fully functional dependency)을 가져야 합니다.
  • 기본키의 일부인 컬럼이 다른 컬럼에 종속되어 있으면 안됩니다.

제 3 정규형 만족 조건 

  • 제 2 정규형을 만족해야 합니다.
  • 이행적 함수적 종속성 (Transitive functional dependency)을 제거해야 합니다.
  • 기본키가 아닌 컬럼이 다른 컬럼에 종속되어 있으면 안됩니다.

BCNF 정규형 만족 조건 

  • 모든 결정자 (Determined)가 후보키(Candidate key)이어야 합니다.
  • 결정자란 어떤 컬럼의 값에 의해서 다른 컬럼의 값이 결정되는 경우를 의미합니다.

정규화 장/단점

정규화의 장점은 데이터 중복을 최소화하여 저장 공간을 절약하고 데이터 일관성과 정확성을 높일 있다는 것입니다. 단점으로는 데이터베이스에 대한 이해도와 설계 능력이 요구되며, 데이터 조회 성능이 저하될 있다는 점이 있습니다.

 

역정규화를 하는 이유에 대해 아는대로 설명해주세요.

역정규화는 데이터베이스의 성능을 높이기 위해 일부러 중복을 추가하는 것입니다. 예를 들어, 여러 개의 테이블을 조인해야 하는 빈번한 쿼리가 있다면 해당 테이블들을 하나의 테이블로 합쳐서 쿼리 성능을 개선할 있습니다. 역정규화는 성능 개선을 위해 사용되지만, 중복 데이터로 인한 데이터 일관성 문제와 유지보수 어려움 등의 문제점이 있기 때문에 신중히 사용해야 합니다.


JOIN 이란

JOIN의 필요성

데이터베이스에서 JOIN 이상의 테이블에서 데이터를 검색하기 위한 필수적인 도구입니다. JOIN 사용하면 데이터베이스에서 데이터를 조합하고 비교할 있으므로 복잡한 쿼리를 작성할 있습니다.

 

JOIN의 종류 각각 설명

  1. INNER JOIN: 테이블에서 매칭되는 행만 반환합니다.
  2. LEFT JOIN: 왼쪽 테이블을 기준으로 오른쪽 테이블과 매칭되는 행을 반환하고, 오른쪽 테이블에 매칭되는 값이 없으면 NULL 값을 반환합니다.
  3. RIGHT JOIN: 오른쪽 테이블을 기준으로 왼쪽 테이블과 매칭되는 행을 반환하고, 왼쪽 테이블에 매칭되는 값이 없으면 NULL 값을 반환합니다.
  4. FULL OUTER JOIN: 테이블 하나에 매칭되는 값이 있는 모든 행을 반환합니다.

JOIN에서 ON과 WHERE의 차이를 설명해주세요.

JOIN에서 ON 조인할 조건을 지정하는 것이고, WHERE 결과 집합에 대한 조건을 지정합니다. ON 개의 테이블 조인 조건을 설정하고 WHERE 결과 집합을 필터링하기 위한 추가 조건을 지정합니다.

 

주의사항

  • 가능한 경우에는 JOIN을 사용하기보다는 인덱스를 사용하여 데이터 검색 속도를 향상시키는 것이 좋습니다.
  • JOIN 많이 사용하면 성능 문제가 발생할 있으므로 JOIN 사용하기 전에 테이블 구조를 고려해야 합니다.

쿼리 수행 순서 설명(select -> from -> where -> group by -> having -> column -> order by -> limit)

  1. SELECT
  2. FROM
  3. WHERE
  4. GROUP BY
  5. HAVING
  6. SELECT (컬럼 별칭)
  7. ORDER BY
  8. LIMIT

HAVING과 WHERE의 차이를 설명해주세요.

HAVING GROUP BY 그룹화된 결과 집합에서 조건을 지정합니다. WHERE FROM 절에서 가져온 결과 집합에서 조건을 지정합니다.

 

group by의 역할에 대해 설명해주세요.

GROUP BY SELECT 문에서 집계 함수를 사용할 사용됩니다. 집계 함수는 데이터를 그룹화하고 합계, 평균, 최대, 최소 등을 계산합니다.

 

DELETE, TRUNCATE, DROP의 차이를 설명해주세요.

  • DELETE: 테이블에서 데이터를 삭제합니다.
  • TRUNCATE: 테이블의 모든 데이터를 삭제합니다.
  • DROP: 테이블 자체를 삭제합니다.

INSERT/ UPDATE/ DELETE/ LIKE/ null

  • INSERT: 테이블에 새로운 데이터를 추가하는 데 사용됩니다.
  • UPDATE: 테이블의 기존 데이터를 수정하는 데 사용됩니다.
  • DELETE: 테이블에서 데이터를 삭제하는 데 사용됩니다.
  • LIKE: 문자열 비교에 사용되며, 와일드카드 문자를 포함하여 패턴 매칭 검색을 수행합니다.
  • NULL: 값이 존재하지 않는 상태를 나타내며, 데이터가 비어 있을 경우 NULL 값을 사용합니다.

 

평균 

SELECT AVG(column_name) FROM table_name;

 

합계

SELECT SUM(column_name) FROM table_name;

 

최고 

SELECT MAX(column_name) FROM table_name;

 

최저 

SELECT MIN(column_name) FROM table_name;

테이블 정보

DESC table_name;

위의 명령어를 실행하면 테이블의 구조, 컬럼명, 데이터 타입, NULL 가능 여부 등을 확인할 있습니다.

 

중복 제거

SELECT DISTINCT city FROM customers;

 

IN, NOT IN 설명

SELECT * FROM employees WHERE position IN ('사원', '대리');

 

숫자에서 문자로

SELECT CAST(salary AS VARCHAR) FROM employees;

 

문자에서 숫자로

SELECT CAST(salary AS INT) FROM employees;

 

자에서 날짜로

SELECT CAST('2023-04-27' AS DATE) FROM employees;

 

날짜 관련 함수

  • NOW(): 현재 시간을 반환합니다.
  • YEAR(): 년도를 반환합니다.
  • MONTH(): 월을 반환합니다.
  • DAY(): 일을 반환합니다.
  • DATE(): 날짜를 반환합니다.
  • DATEDIFF(): 날짜 사이의 일수를 반환합니다.

분석 함수

  • AVG(): 평균 값을 반환합니다.
  • SUM(): 합계 값을 반환합니다.
  • MAX(): 최대 값을 반환합니다.
  • MIN(): 최소 값을 반환합니다.
  • COUNT(): 레코드 수를 반환합니다.

누적 함수

  • CUME_DIST(): 누적 분포 값을 반환합니다.
  • LAG(): 이전 행의 값을 반환합니다.
  • LEAD(): 다음 행의 값을 반환합니다.
  • FIRST_VALUE(): 첫 번째 행의 값을 반환합니다.
  • LAST_VALUE(): 마지막 행의 값을 반환합니다.

댓글