DataBase(2)

상목·2023년 2월 6일
0

DataBase

목록 보기
1/1

1. 관계형 데이터베이스란 rdbms

  • 테이블, 행, 열의 정보를 구조화하는 방식
  • 테이블을 조인하여 정보 간 관계 또는 링크를 설정할 수 있는 기능이 있어, 여러 데이터 포인트 간의 관계를 쉽게 이해하고 정보를 얻을 수 있습니다.
  • 비즈니스에서 데이터를 구성, 관리, 연결하는 데 도움이 되는 스프레드시트 파일 모음

2. 데이터베이스 엔티티란 entity

  • 실제, 독립체라는 뜻으로 데이터 모델링에서 사용되는 객체
  • 업무에 필요하고 유용한 정보를 저장하고 관리하기 위한 "어떤 것(Thing)"
  • 시스템을 구축하고자 하는 업무에서 필요로 하고 관리하고자 하는 정보여야만 한다.
  • 엔터티는 유일한 식별자가 있어야 한다. (기본키)
  • 두 개 이상의 인스턴스의 집합이어야 한다.
  • 반드시 속성을 포함해야 합니다.
  • 다른 엔터티 간의 관계가 존재해야 합니다. (존재적 연관성, 행위적 연관성)

<유무형에 따른 분류>

<발생시점에 따른 분류>

3. 데이터베이스 속성이란 Attribute

  • 데이터베이스를 구성하는 가장 작은 논리적 단위
  • 개체의 특성을 기술
  • 데이터 항목 또는 데이터 필드에 해당
  • 속성의 수를 디그리(Degree) 또는 차수라고 한다.

<도메인>

  • 하나의 속성(attribute)이 취할 수 있는 같은 타입의 원자값들의 집합
  • 실제 속성 값이 나타날 때 그 값의 합법 여부를 시스템이 검사하는데에도 이용

4. 데이터베이스 식별자란 Identifier

  • 여러 개의 인스턴스를 담고 있는 엔터티에서 인스턴스를 구별하기 위한, 즉 엔터티를 대표하는 속성을 의미
  • 반드시 하나의 유일한 식별자가 존재해야 한다.
  • 엔터티내에서 특정 인스턴스를 구별하는 방법으로 식별자를 이용

<식별자의 특징>

  1. 유일성 - 주식별자에 의해 엔터티내에 모든 인스턴스들을 유일하게 구분할 수 있어야 함
  2. 최소성 - 주식별자를 구성하는 속성의 수는 유일성을 만족하는 최소의 수가 되어야 함
  3. 불변성 - 주식별자가 한 번 특정 엔터티에 지정되면 그 식별자의 값은 변하지 않아야 함
  4. 존재성 - 주식별자가 지정되면 반드시 데이터 값이 존재 해야함(Null값 안됨)

<식별자의 분류>

<주 식별자>

  • 엔터니 내에서 각 어커런스를 구분할 수 있는 구분자이며, 타 엔터티와 참조관계를 연결할 수 있는 식별자

<보조 식별자>

  • 엔터티 내에서 칵 어커런스를 구분할 수 있는 구분자이지만 대표성을 가지지 못해 참조관계 연결을 못함

<스스로 생성되었는지에 따른 분류>

내부 식별자

  • 엔터티 내부에서 스스로 만들어지는 식별자

외부식별자

  • 타 엔터티와의 관계를 통해 타 엔터티로부터 받아오는 식별자

<단일 속성인지에 따른 분류>

단일식별자(Single Identifier)

  • 하나의 속성으로 구성된 식별자

복합식별자

  • 둘 이상의 속성으로 구성된 식별자

5. 데이터베이스 관계란 relationship

  • 한 릴레이션에는 똑같은 튜플이 포함될 수 없음
  • 한 릴레이션에 포함된 튜플 사이에는 순서가 없음
  • 튜플들의 삽입, 삭제 등의 작업으로 인해 릴레이션은 시간에 따라 변함
  • 릴레이션 스키마를 구성하는 속성들 간의 순서는 중요하지 않음
  • 속성의 유일한 식별을 위해 속성의 명칭은 유일해야 함
  • 속성을 구성하는 값은 동일한 값이 있을 수 있음
  • 릴레이션을 구성하는 튜플을 유일하게 식별하기 위해 속성들의 부분집합을 키로 설정
  • 속성의 값은 논리적으로 더 이상 쪼갤 수 없는 원자값만을 저장

6. 데이터베이스 제약조건

  • 데이터의 무결성을 지키기위해 입력받은 데이터에 대한 제한을 두는 것을 의미

<제약조건의 종류>

1) NOT NULL : 제약조건을 설정 시, 해당필드는 NULL 값을 저장할 수 없게 하는 제약조건입니다.

Create Table 테이블(
	필드명 INT NOT NULL   //해당 필드는 Null값 저장x
);

2) UNIQUE : 제약조건을 설정 시, 중복된 값을 저장할 수 없게 하는 제약조건입니다.

//기본적인 Unique
Create Table 테이블(
	필드명 INT UNIQUE  
); 

//제약조건에 이름부여(constraint)
Create Table 테이블(
	필드명 INT ,
	...
	CONSTRAINT 제약조건 UNIQUE 필드명  
);

3) PRIMARY KEY : 기본키를 지정하는 제약조건으로, 해당 필드는 NOT NULL과 UNIQUE 제약조건의 특성을 모두 가집니다.

//기본적인 Primary
Create Table 테이블(
	필드명 INT PRIMARY KEY   
);

//제약조건에 이름부여(constraint)
Create Table 테이블(
	필드명 INT ,
	...
	CONSTRAINT 제약조건 PRIMARY KEY 필드명  
);

4) FOREIGN KEY : 한 테이블을 다른 테이블과 연결하여 외래키를 지정하는 제약조건으로, 해당 테이블은 다른 테이블에 의존됩니다.

Create Table 테이블(
	필드명 INT ,
	...
	CONSTRAINT 제약조건 FOREIGN KEY (필드명) 
	REFERENCES 테이블명 (필드명)
 );
 이 경우 특정 테이블의 삭제 및 수정을 진행할 때, 연관된 필드가 어떤 동작을 수행할지 지정해 줄 수 있습니다. 아래는 예제코드입니다.

//삭제 및 수정 시 연관되어있는 필드 같이 삭제
 ON DELETE CASCADE
 ON UPDATE CASCADE

//삭제 및 수정 시 연관되어있는 필드 null
 ON DELETE SET NULL
 ON UPDATE SET NULL

//삭제 및 수정 시 연관되어있는 필드 기본값으로 설정
 ON DELETE SET DEFAULT
 ON UPDATE SET DEFAULT

//참조하는 테이블에 데이터 남아있으면 삭제 불가
 ON DELETE RESTRICT
 ON UPDATE RESTRICT

5) DEFAULT : 해당 필드의 디폴트값을 설정할 수 있게 해주는 제약조건입니다.


Create Table 테이블(
	필드명 INT DEFAULT '기본값'
);

7. 데이터베이스 무결성

  • 데이터의 정확성, 일관성, 유효성이 유지되는 것을 의미
  • 정확성이란 중복이나 누락이 없는 상태를 뜻하고, 일관성은 원인과 결과의 의미가 연속적으로 보장되어 변하지 않는 상태를 뜻한다.
  • 무결성을 설계하지 않으면 테이블에 중복된 데이터 존재, 부모와 자식 데이터 간의 논리적 관계 깨짐, 잦은 에러와 재개발 비용 발생 등과 같은 문제가 발생

<데이터 무결성 제약 조건의 종류>

1. 개체 무결성(Entity integrity)

  • 기본 키 제약이라고도 하며, 테이블은 기본키를 지정하고 그에 따른 무결성 원칙을 지켜야 하는 조건
  • 기본 키(Primary Key)에는 Null 값이 올 수 없음
  • 기본 키는 테이블 내에 오직 하나의 값만 존재해야 함 (하나의 테이블 내에 동일한 기본 키를 가진 레코드는 존재할 수 없음)

** 기본 키란? -> 테이블에서 특정 레코드를 구별하기 위해 후보 키 중에서 선택된 고유한 식별자 키

2. 참조 무결성(Referential integrity)

  • 외래 키 제약이라고도 하며, 테이블 간의 참조 관계를 선언하는 제약조건
  • 외래 키(Foreign Key)의 값은 Null이거나 참조 릴레이션의 기본키 값과 동일해야 함
  • 외래 키 속성은 참조할 수 없는 값을 지닐 수 없음 (즉, 외래 키 속성 값이 상위 테이블의 인스턴스에 반드시 존재하거나 Null이어야 함)

** 외래 키란? -> 한 테이블의 키 중에서 다른 테이블의 레코드를 유일하게 식별할 수 있는 키

3. 도메인 무결성(Domain integrity)

  • 테이블에 존재하는 필드의 무결성을 보장하기 위한 것
  • 필드의 타입, Null 값 허용 등에 대한 사항을 정의하고 올바른 데이터가 입력되었는지 확인하는 조건
  • Ex) 주민등록번호 필드에 문자가 입력되는 경우엔 도메인의 무결성이 깨졌다고 볼 수 있음

4. Null무결성(Null integrity)

  • 테이블의 특정 속성 값이 Null이 될 수 없게 하는 조건

5. 고유 무결성 (Unique integrity)

  • 테이블의 특정 속성에 대해 각 레코드들이 갖는 값들이 서로 달라야 하는 조건

6. 키 무결성 (Key integrity)

  • 하나의 테이블에는 적어도 하나의 키가 존재해야 하는 조건

7. 관계 무결성 (Relationship integrity)

  • 테이블의 어느 한 레코드의 삽입 가능 여부 또는 한 테이블과 다른 테이블의 레코드들 사이의 관계에 대한 적절성 여부를 지정한 조건

<무결성 제약조건 장단점>

장점 - 스키마를 정의할 때 일관성 조건을 오직 한 번만 명시하고, 데이터베이스가 갱신될 때 DBMS가 자동적으로 일관성 조건을 검사하므로 응용 프로그램들은 일관성 조건을 검사할 필요가 없음

단점 - 프로그래밍 작업이 훨씬 복잡해지고, 무결성 제약조건을 반복해서 구현해야 하고, 무결성 제약조건들 간에 서로 충돌이 발생할 수 있음

8. 데이터베이스 인덱스

  • 데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 자료 구조라고 한다.
  • 인덱스 생성 시 데이터를 오름차순으로 정렬하기 때문에 정렬된 주소체계라고 표현할 수 있다.
  • 가장 큰 특징은 데이터들이 정렬이 되어있다.

9. 데이터베이스 풀스캔과 인덱스스캔

<풀 스캔>

  • 테이블을 만들고 안에 데이터가 쌓이게 되면 테이블의 레코드(row : 행)는 내부적으로 순서가 없이 뒤죽박죽으로 저장이 된다.

  • WHERE절에 특정 조건에 맞는 데이터들을 찾아낼 때도 레코드의 처음부터 끝까지 다 읽어서 검색 조건과 맞는지 비교해야 한다.

<인덱스 스캔>

  • 인덱스 테이블 스캔(Index Table Scan) 시 인덱스 테이블은 데이터들이 정렬되어 저장되어 있기 때문에 해당 조건(WHERE)에 맞는 데이터들을 빠르게 찾아낼 수 있는 것

10. 데이터베이스 프로시저와 함수

<프로시저>

  • 절차형 SQL을 활용하여 특정 기능을 수행하는 일종의 트랜잭션 언어이며 호출을 통해 실행되어 미리 저장해 놓은 SQL 작업을 수행한다.
  • 여러 프로그램에서 호출하여 사용 가능하고, 시스템의 일일 마감 작업, 일괄 작업 등에 주로 사용된다.
  • 프로시저의 BODY는 BEGIN과 END 사이의 코드 작성 부분이며 하나 이상의 SQL 문이 있어야 한다.
  • 프로시저 실행을 위해 EXECUTE, CALL, EXEC로 사용할 수 있다. ex) EXEC 프로시저명; 제거를 위해서는 DROP PROCEDURE를 사용한다.

<프로시저 구성>

  • DECLARE : 프로시저의 명칭, 변수, 인수, 데이터 타입을 정의하는 선언부 (필수)
  • BEGIN / END : 프로시저의 시작과 종료를 의미 (필수)
  • CONTROL : 조건문 또는 반복문이 삽입, 순차적 처리
  • SQL : DML, DCL이 삽입돼, 조회, 추가, 수정, 삭제 작업을 수행
  • EXCEPTION : 구문 실행 중 예외 발생 시 처리 방법 정의
  • TRANSACTION : 작업들을 DB에 적용할지 취소하리 결정하는 처리부

<함수>

  • 미리 정의된 기능을 통해 데이터를 좀 더 편리하게 조작할 수 있도록 도와줍니다.
  • 사용자가 입력 값 X를 넣으면 정해 놓은 출력 값 Y가 나오는 개념이다.
  • 함수를 이용하여 문자, 숫자, 날짜 값 등을 조작할 수 있으며, 각 데이터 타입(data type, 자료형)끼리 변환할 수도 있습니다(단일 행 함수 기능).
  • 복수의 행을 조합하여 그룹당 하나의 결과로도 출력할 수 있습니다(그룹 함수 기능).

11. 데이터베이스 트리거

  • 특정 테이블에 INSERT, DELETE, UPDATE 같은 DML 문이 수행되었을 때, 데이터베이스에서 자동으로 동작하도록 작성된 프로그램
  • 사용자가 직접 호출하는 것이 아니라, 데이터베이스에서 자동적으로 호출하는 것이 가장 큰 특징
  • 테이블과 뷰 데이터베이스 작업을 대상으로 정의할 수 있으며, 전체 트랜잭션 작업에 대해 발생되는 트리거(Trigger)와 각행에 대해 발생되는 트리거(Trigger)가 있습니다.
  • 데이터베이스에 의해 자동 호출되지만 결국 INSERT, UPDATE, DELETE 구문과 하나의 트랜잭션 안에서 일어나는 일련의 작업들이라 할 수 있습니다.

12. 데이터베이스 정규화

  • 기본 목표는 테이블 간에 중복된 데이타를 허용하지 않는다는 것이다.
  • 중복된 데이터를 허용하지 않음으로써 무결성(Integrity)를 유지할 수 있으며, DB의 저장 용량 역시 줄일 수 있다.
  • 테이블을 어떻게 분해되는지에 따라 정규화 단계가 달라진다.
  • 정규화는 데이터 조회(select) 시에 조인(join)을 유발하기 때문에 CPU와 메모리를 많이 사용한다는 단점이 있다.

1) 제1 정규화

  • 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것

2) 제2 정규화

  • 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다.
  • 완전 함수 종속이라는 것은 기본키의 부분집합이 결정자가 되어선 안된다는 것을 의미한다.

3) 제3 정규화

  • 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다.
  • 이행적 종속이라는 것은 A -> B, B -> C가 성립할 때 A -> C가 성립되는 것을 의미한다.

4) BCNF 정규화

  • 제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것이다.

13. 데이터베이스 반정규화

  • 데이터베이스의 성능 향상을 위하여, 데이터 중복을 허용하고 조인을 줄이는 데이터베이스 성능 향상 방법이다.
  • 반 정규화는 조회(select) 속도를 향상시키지만, 데이터 모델의 유연성은 낮아진다.

<반 정규화를 수행하는 이유>

1) 정규화에 충실하여 종속성, 활용성은 향상 되었지만 수행속도가 느려진 경우
2) 다량의 범위를 자주 처리해야하는 경우
3) 특정 범위의 데이터만 자주 처리하는 경우
4) 요약/집계 정보가 자주 요구되는 경우

<반정규화 절차>

<반정규화 기법>

1) 계산된 컬럼 추가 - 배치 프로그램으로 총판매액, 평균잔고, 계좌평가를 미리 계산하고 그 결과를 특정 칼럼에 추가한다.

2) 테이블 수직 분할 - 하나의 테이블의 두 개 이상의 테이블로 분할한다. 즉, 칼럼을 분할하여 새로운 테이블을 만드는 것이다.

3) 테이블 수평분할 - 하나의 테이블에 있는 값을 기준으로 테이블을 분할하는 방법이다.

<테이블 병합>

  • 1:1 관계의 테이블을 하나의 테이블로 병합해서 성능을 향상시킨다.
  • 1:N 관계의 테이블을 병합하여 성능을 향상시킨다. 하지만 많은 양의 데이터 중복이 발생한다.
  • 슈퍼 타입과 서브 타입 관계가 발생하면 테이블을 통합하여 성능을 향상시킨다.

14. DCL : Data Manipulation Language (데이터 제어어)

  • GRANT - 사용자에게 권한을 부여하는 명령어
  • REVOKE - 사용자에게 권한을 삭제하는 명령어
  • 데이터베이스에 접근하고 객체들을 사용하도록 권한을 주고 회수하는 명령어들을 말함.

15. DDL : Data Definition Language (데이터 정의어)

  • 테이블과 같은 데이터 구조를 정의하는데 사용되는 명령어들로 (생성, 변경, 삭제, 이름변경) 데이터 구조와 관련된 명령어들을 말함.
  • CREATE - 테이블 등을 생성
  • ALTER - 테이블을 수정
  • DROP - 테이블을 삭제
  • TRUNCATE - 테이블을 초기화

16. DML ( 데이터 조작어)

  • SELECT - 데이터베이스에 들어 있는 데이터를 조회하거나 검색하기 위한 명령어를 말하는 것으로 RETRIEVE 라고도 함
  • INSERT, UPDATE, DELETE - 데이터베이스의 테이블에 들어 있는 데이터에 변형을 가하는 종류(데이터 삽입, 수정, 삭제)의 명령어들을 말함.

17. TCL: Transaction Control Language (트랜잭션 제어어)

  • COMMIT -
  • ROLLBACK
  • SAVEPOINT
  • 논리적인 작업의 단위를 묶어서 DML에 의해 조작된 결과를 작업단위(트랜잭션) 별로 제어하는 명령어를 말함.
profile
풀스택 개발 이야기

0개의 댓글