DB

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

과거는 엑셀같은 파일 시스템에 데이터를 관리했다.
정리정돈해서 중요한 효과들을 얻을 수있다.
행이 1억개라면? 스프레드시트는 원하는 데이터로 필터링할 수 있다.

파일에 직접 저장하는 것보다 데이터를 잘 정리정돈되면 '구조적'으로 되면 데이터 가공이 훨씬 쉬워진다.
스프레드시트는 파일에서 데이터베이스로 가는 길목에 있다.

넓게보면 데이터베이스 특성을 가지고 있다.
스프레드시트와 데이터베이스차이는 컴퓨터 언어를 이용해서 데이터를 추가 삭제 수정하고 읽을 수 있다는것이 차이점이 있다.
중요한 장점은 자동화할 수 있다. 전문적인 데이터베이스들이 가지고 있는 중대한 장점이다

2.데이터베이스의특징

데이터의독립성
-물리적독립성 데이터베이스 사이즈를 늘리거나 성능향상을 위해 데이터파일을 늘리거나 새롭게 추가해도 관련된 응용프로그램을 수정할 필요가없다.
-논리적독립성 데이터베이스는 논리적인 구조로 다양한 응용프로그램의 논리적요구를 만족시켜줄 수 있다.

데이터의무결성
여러경로를 통해 잘못된 데이터가 발생하는 경우의 수를 방지하는 기능으로 데이터의 유효성 검사를 통해 데이터의 무결성을 구현하게 된다.

데이터의보안성
인가된 사용자들만 데이터베이스나 데이터베이스 ㅐㄴ의 자원에 접근할 수 있도록 계정관리 또는 접근권한을 설정함으로써 모든 데이터에 보안을 구현할 수 있다.

데이터의 일관성
연관된 정보를 논리적인 구조로 관리함으로써 어떤 하나의 데이터만 변경했을 경우 발생할 수 있는 데이터의 불일치성을 배제할 수 있다. 또한 작업 중 일부 데이터만 변경되어 나머지 데이터와 일치하지 않는 경우의 수를 배제할 수 있다.

데이터중복최소화
데이터베이슨느 데이터를 통합해서 관리함으로써 파일시스템 단점 중 하나인 자료의 중복과 데이터의 중복성 문제를 해결할 수 있다.

3. DBMS

DBMS는 데이터베이스 관리시스템이다. 사용자가 데이터에 관한 정보를 가능한 효율적, 효과적으로 구성복원검색할 수 있도록 하는 응용프로그램 모음이다. MYSQL Oracle등이 있다.

4.RDBMS란

관계형데이터베이스관리시스템은 데이터베이스에 별도의 테이블에 저장된 관계형 데이터 모델을 기반으로 공통열의 사용과 관련이 있다. SQL을 사용해서 관계형데이터베이스에서 데이터에 쉽게 액세스할 수 있다.

5. 데이터베이스 언어

DDL : 데이터 정의어, 데이터베이스를 정의하는 언어 데이터베이스 테이블 등을 생성하는 역할을 한다. CREATE(생성) DROP(삭제) ALTER(수정) TRUNCATE(초기화)
DML : 데이터 조작어, 정의도니 데이터베이스에 입력된 레코드를 조회하거나 입력 수정 삭제하는 역할을 하는 언어이다. SELECT(읽기), DELETE(삭제), UPDATE(수정), INSERT(생성)
DCL : 데이터 제어어, 데이터를 제어하는 언어 데이터의 보안 무결성 회복 병행수행제어 등을 정의하는데 사용 COMMIT ROLLBACK GRANT REVOKE

6. 정규화

정규화는 데이터의 무결성을 유지하기 위해 잘 정의된 방식으로 데이터를 분할하여 데이터베이스에서 중복 데이터를 제거하는 프로세스이다. 즉 관계형데이터베이스에서 중복을 최쇠화하기 위해 데이터를 구조화하는 작업이다. 이 프로세스는 많은 저장공간을 절약한다.

6.1 제 1정규형

열에 원자적 값만을 포함한다. 원자적이란 하나의 레코드에 특정컬럼이 하나의 값만 가지는 것을 의미한다.
같은 데이터가 여러 열에 반복되지 말아야한다. 전화번호가 여러개라고 전화번호 컬럼이 늘어나는 것 또한 원자적이지 않다.
각 행은 유일무이한 식별자인 기본키를 가져야한다.

6.2 제 2정규형

제 1정규형이어야한다.
부분적 함수의존이 없다.

기본키를 복합키로 만들었을 경우 어떤 컬럼이 복합키 컬럼 들 중 일부에 종속될때 부분적 함수의존이 있다고한다.
종속된다는 것은 복합키 중하나가 바뀌면 그 종속된 커럴밍 바뀌는 것을 말한다.
키가 아닌 커럼이 키의 일부분에 종속된 경우를 말한다.

결론은 특정커럼이 변경될때 다른 컬럼이 변경되면 부분적함수의존이라고 한다.
그래서 새로운 열을 만들어서 AUTO_INCRMENT id를 만드는 이유이다.
이걸 사용하면 부분적 함수의존이 없어진다.

6.3 제3정규형

제2정규형이어야한다.
이행적 종속이 없어야한다.

부분적 함수의존과 이행적 종속은 거의 비슷한 말이다.
전자는 키의 일부분에 의존하는 것이고 후자는 키가 아닌 컬럼에 의존하는 것이다.

키가 아닌 컬럼끼리 의존하고 있는 것이 이행적 종속이다.
이 컬럼들을 다른 테이블로 분리하는 것이 좋다.

7. 제약조건(제약사항)

테이블에 부적절한 자료가 입력되는 것을 방지하기 위해 여러가지 규칙을 정해놓는 것을 말한다.
간단하게 말하면 테이블 안에서 데이터의 성격을 정의하는 것을 말한다.

1.NOT NULL : 컬럼을 필수 필드화시킬때 사용한다. 값을 꼭 입력해야한다.
2.UNIQUE : 데이터의 유릴성을 보장, 중복되는 데이터가 있을수 없게한다. 자동으로 인덱스가 생성된다. NULL을 허용한다. 하나의 테이블에 여러개 있을 수 있다.
3.CHECK : 컬럼의 값을 어떤 특정범위로 제한한다. 정규식으로 제한할 수 도 있다.
4.DEFAULT : 컬럼의 기본값을 지정한다. 데이터를 입력하지 않아도 지정된 값이 기본으로 입력된다.
5.기본키(PRIMARY KEY) : 기본키는 NOT NULL + UNIQUE한 컬럼이다. 하나의 테이블에 하나만 지정할 수 있고 테이블에서 레코드를 판별하는 유일한 식별자라고 할 수 있다. 그 데이터 행을 대표하는 컬럼이다. 두개를 합쳐서 복합키로 기본키를 저장할 수도 있다.
6.외래키(FOREIGN KEY) : 기본키를 참조한느 컬럼 컬럼들의 집합이다. 외래키를 가지는 컬럼의 데이터형은 외래키가 참조하는 기본키의 컬럼과 데이터 형이 같아야한다.

8. 인덱스

인덱스(색인)은 컴퓨터에서 내용을 미리 목록으로 만들어 놓고 찾고자하는 내용을 검색하는데 시간을 줄이기 위한 것이다. 색인은 검색성능을 향상시키기 위한 것으로 정보 요구자가 보다 빨리 정보에 접근할 수 있도록 그 정보의 소재를 표시해주고 원하는 자료의 유무를 확안시켜 주며 자료의 신속한 이용을 가능하게 하는 기능을 가지고 있다. 인덱스가 많으면 조회 속도는 빠르지만 입력 수정 삭제의 속도는 떨어진다.
SELECT 쿼리 문장의 WHERE 조건절에 사용되는 컬럼이라고 전부 인덱스로 생성하면 데이터 저장 성능이 떨어지고 인덱스의 크기가 비대해져서 오히려 역효과만 불러올 수 있다.

인덱스 자료구조
B+-Tree 인덱스 알고리즘
일반적으로 사용되는 인덱스 알고리즘은 B+-Tree 알고리즘이다.
B+-Tree 인덱스는 칼럼의 값을 변형하지 않고(사실 값의 앞부분만 잘라서 관리한다.), 원래의 값을 이용해 인덱싱하는 알고리즘이다.

Hash 인덱스 알고리즘
칼럼의 값으로 해시 값을 계산해서 인덱싱하는 알고리즘으로 매우 빠른 검색을 지원한다. 하지만 값을 변형해서 인덱싱하므로, 특정 문자로 시작하는 값으로 검색을 하는 전방 일치와 같이 값의 일부만으로 검색하고자 할 때는 해시 인덱스를 사용할 수 없다. 주로 메모리 기반의 데이터베이스에서 많이 사용한다.

왜 index 를 생성하는데 b-tree 를 사용하는가?
데이터에 접근하는 시간복잡도가 O(1)인 hash table 이 더 효율적일 것 같은데?
SELECT 질의의 조건에는 부등호(<>) 연산도 포함이 된다. hash table 을 사용하게 된다면 등호(=) 연산이 아닌 부등호 연산의 경우에 문제가 발생한다. 동등 연산(=)에 특화된 hashtable은 데이터베이스의 자료구조로 적합하지 않다.

SELECT 쿼리의 성능을 월등히 향상시키는 INDEX 항상 좋은 것일까?
쿼리문의 성능을 향상시킨다는데, 모든 컬럼에 INDEX 를 생성해두면 빨라지지 않을까?
결론부터 말하자면 그렇지 않다.
우선, 첫번째 이유는 INDEX 를 생성하게 되면 INSERT, DELETE, UPDATE 쿼리문을 실행할 때 별도의 과정이 추가적으로 발생한다.
INSERT 의 경우 INDEX 에 대한 데이터도 추가해야 하므로 그만큼 성능에 손실이 따른다.
DELETE 의 경우 INDEX 에 존재하는 값은 삭제하지 않고 사용 안한다는 표시로 남게 된다.
즉 row 의 수는 그대로인 것이다. 이 작업이 반복되면 어떻게 될까?
실제 데이터는 10 만건인데 데이터가 100 만건 있는 결과를 낳을 수도 있는 것이다.
이렇게 되면 인덱스는 더 이상 제 역할을 못하게 되는 것이다. UPDATE 의 경우는 INSERT 의 경우, DELETE 의 경우의 문제점을 동시에 수반한다. 이전 데이터가 삭제되고 그 자리에 새 데이터가 들어오는 개념이기 때문이다.
즉 변경 전 데이터는 삭제되지 않고 insert 로 인한 split 도 발생하게 된다.

결론은 적절하게 사용해야한다.

9. 조인

조인이 무엇인가?
DB는 중복을 없애고 참조하는 방식으로 데이터가 결합되지 않도록 했엇다.
합쳐서 원래 모양으로 조인을 활용해서 활용할 필요가 있다. 이것을 조인이라고 한다.

조인의 종류
INNER JOIN : 관계가 있는 것만 합치는 것이다.

LEFT (OUTER) JOIN : A에 B를 조인한다고 햇을때 A의 데이터는 모두 보여주고 B는 관계있는 것만 연결해주는 것이다.

RIGHT (OUTER) JOIN : LEFT와 반대로 B를 기준으로 조인한다.

SELF JOIN : 하나의 테이블에서 하나의 컬럼을 기준으로 조인한다.

10. 유니온

JOIN처럼 합치는 것이다. 그러나 JOIN은 컬럼을 합쳣다.
UNION은 레코드를 합치는 것이다. 관련이 없어도된다. 컬럼의 개수만 맞춰주면 레코드를 합칠 수 잇다.

어디에 사용하나? 게시판이 3종류인데 별도의 테이블을 만들었다.
합쳐서 통합검색을 할 경우가 있다. 이럴때 사용한다. A조건 결과물 B조건 결과물 등을 일일히합쳐서 만들 수 있다.

SELECT ID, NAME FROM MEMBER;
UNION
SELECT WRITER_ID, TITLE FROM NOTICE;

유니온이라는 것이 사실 두개레코드를 합치는 것뿐만이 아니다.
UNION 같은 내용이면 하나로 합친다. 완전이 데이터가 일치하면? 1테이블 123 2테이블 124면 1234로 4개만 나온다.
MINUS 1테이블 123 2테이블 124일때 2테이블을 기준으로 뺀다. -> 3만남음
INTERSECT 공통분모만 남김 1테이블 123 2테이블 124일때 1,2만남음
UNION ALL 그냥 상관없이 다 합침

그런데 보통 유니온은 하나의 테이블로도 할 수 있다.
SELECT ID, NAME FROM MEMBER WHERE ID LIKE '%n%';
UNION
SELECT ID, NAME FROM MEMBER WHERE ID LIKE '%g%';
필터링한 후 또 필터링 하고싶을때 두개의 결과집합으로 연산하고 싶을때 사용한다.

MYSQL은 UNION과 UNION ALL만지원한다.

11. 트랜잭션

트랜잭션은 작업의 완전성을 보장해주는 것이다. 논리적인 작업 셋을 모두 완벽하게 처리하거나 완벽하게 처리하지 못한경우 원상태로 복구해서 작업의 일부만 적용되는 현상을 막아주는 기능이다. 사용자의 입장에서는 작업의 논리적 단위로 이해를 하 수 있고 시스템 입장에서는 데이터를 접근 또는 변경하는 프로그램의 단위가된다.

예를들어 계좌이체를 한다면 A에서 출금 B로 입금 이 과정을 거쳐하는데 중간에 문제가 생기면 한쪽만 출금되는 상태가 발생할 수도 있으니 이를 트랜잭션이라고 보고 중간에 문제가 생기면 처음으로 롤백하는 것을 말한다.

트랜잭션의 특성(ACID)
1.원자성 : 만약 트랜잭션 중간에 문제가 발생한다면 트랜잭션에 해당하는 어떠한 작업 내용도 수행되어서는 안되며 아무런 문제가 발생되지 않았을 경우에만 모든 작업이 수행되어야 한다.
2.일관성 : 트랜잭션이 완료된 다음의 상태에서도 트랜잭션이 일어나기 전 상황과 동일하게 데이터의 일관성을 보장해야한다.
3.고립성 : 각각의 트랜잭션은 서로 간섭없이 독립적으로 수행되어야한다.
4.지속성 : 트랜잭션이 정상적으로 종료된 다음에는 영구적으로 데이터베이스에 작업의 결과가 저장되어야한다.

트랜잭션에서 주의해야할점
트랜잭션은 꼭 최소한의 코드에만 적용하는 것이 좋다. 트랜잭션의 범위를 최소화해야한다. 일반적으로 DB의 커넥션은 ㅅ개수가 제한적인데 각 단위의 프로그램에 커넥션을 소유하는 시간이 길어진다면 여유 커넥션의 개수는 줄어들게 된다. 어느순간 각단위 프로그램에서 커넥션을 가져가기 위해 기다려야하는 상ㅅ황이 발생할 수도 있다.

이것을 교착상태라고 한다.
복수의 트랜잭션을 사용하다보면 교착상태가 일어날 수 있다. 교착 상태란 두 개 이상의 트랜잭션이 특정 자원의 잠금을 획득한체 다른 트랜잭션이 소유하고 있는 잠금을 요구하면 아무리 기다려도 상황이 바뀌지않는 상태가 되는데 이를 교착상태라고 한다.

이를 해결하기 위해서
트랜잭션을 자주 컴밋하고
정해진 순더대로 테이블에 접근하고 읽기 잠금획득의 사용를 피한다.

12. SELECT 쿼리의 수행 순서

작성순서는
SELECT FROM WHERE GROUP BY HAVING ORDER BY이다.
실행순서는
FROM WHERE GROUPBY HAVING SELECT ORDER BY이다.

13. 트리거(Trigger)

트리거는 특정 테이블에 대한 이벤트에 반응해 INSERT, DELETE, UPDATE 같은 DML 문이 수행되었을 때, 데이터베이스에서 자동으로 동작하도록 작성된 프로그램
사용자가 직접 호출하는 것이 아닌, 데이터베이스에서 자동적으로 호출한다는 것이 가장 큰 특징이다.

14. 이상 현상

이상 현상은 테이블을 설계할 때 잘못 설계하여 데이터를 삽입,삭제,수정할 때 생기는 논리적 오류
삽입 이상 : 자료를 삽입할 때 특정 속성에 해당하는 값이 없어 NULL을 입력해야 하는 현상
갱신 이상 : 중복된 데이터 중 일부만 수정되어 데이터 모순이 일어나는 현상
삭제 이상 : 어떤 정보를 삭제하면, 의도하지 않은 다른 정보까지 삭제되어버리는 현상
이러한 이상 현상을 예방하고 효과적인 연산을 하기 위해 데이터 정규화를 합니다

15. 프로시저(Procedure)란?

데이터베이스에 대한 일련의 작업을 정리한 절차를 관계형 데이터베이스 관리 시스템에 저장한 것으로 영구저장모듈(Persistent Storage Module)이라고도 불린다.
보통 저장 프로시저를 프로시저라고 부르며, 일련의 쿼리를 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합이다..
즉, 특정 작업을 위한 쿼리들의 블록입니다.
장점
하나의 요청으로 여러 SQL문을 실행시킬 수 있다.(네트워크 부하를 줄일 수 있음)
네트워크 소요 시간을 줄여 성능을 개선할 수 있다.
여러 어플리케이션과 공유가 가능하다. (API처럼 제공가능)
기능 변경이 편하다. (특정 기능을 변경할 때 프로시저만 변경하면 됨)

단점
문자나 숫자열 연산에 사용하면 오히려 C,Java보다 느린 성능을 보일 수 있다.
유지보수가 어렵다.(프로시져가 앱의 어디에 사용되는지 확인이 어려움)

16. nosql과 RDBMS

RDBMS는 모든 데이터를 2차원 테이블 형태로 표현한다.
장점 : 스키마에 맞춰 데이터를 관리하기 때문에 데이터의 정합성을 보장할 수 있다.
단점 : 시스템이 커질 수록 쿼리가 복잡해지고 성능이 저하되며 Scale-out이 어렵다(Scale-up만 가능)

NoSQL(Not Only SQL)은 RDBMS와 반대로 데이터간의 관계를 정의하지 않고, 스키마가 없어 좀 더 자유롭게 데이터를 관리할 수 있으며, 컬렉션이라는 형태로 데이터를 관리한다.

장점 : 스키마 없이 Key-Value 형태로 데이터를 관리해 자유롭게 데이터를 관리할 수 있다.
데이터 분산이 용이하여 성능 향상을 위한 scale-up 뿐만아닌 scale-out 또한 가능하다.
단점 : 데이터 중복이 발생할 수 있고, 중복된 데이터가 변경될 경우 수정을 모든 컬렉션에서 수행해야 한다.
스키마가 존재하지 않기에 명확한 데이터 구조를 보장하지 않아 데이터 구조 결정이 어려울 수 있다.

'개념정리' 카테고리의 다른 글

필기시험준비4  (0) 2023.08.27
필기시험준비3  (1) 2023.08.26
필기 시험 준비..  (0) 2023.08.24
API란?  (0) 2023.08.16
프로세스와 쓰레드의 차이점  (0) 2023.08.08

+ Recent posts