DB

데이터 관리

선호하는 2023. 11. 14. 17:00

데이터 타입 지정

테이블을 만들 때, 각 column마다 데이터의 타입을 지정해 주어야 한다.
데이터 타입을 지정함으로 해당 컬럼에 저장한 값을 어떻게 처리할 지 결정해 둘 수 있다.
데이터 타입을 지정하면, 1.저장할 수 있는 값을 제한하고 2.사용할 때 사용 방식을 지정할 수 있다.
그렇기 때문에, 저장되는 값의 크기나 타입에 따라 적절한 데이터 크기와 타입을 선택하는 것이 중요하다.

숫자 타입

숫자 타입으로 지정한 column에는 숫자 이외의 값, 문자열이나 날짜,시간 등은 저장되지 않는다.
MySQL의 경우, 숫자형 데이터를 정수형 INT, 실수형 DECIMAL, FLOAT, DOUBLE 등의 타입들로 처리하고 있다.
이 경우, 저장되는 값의 크기에 따라 적절한 데이터 타입을 선언할 수 있는 것이 장점이다.
OracleSQL의 경우, NUMBER 타입 하나로 처리하고 있다.
이 경우, 타입 유연성을 높일 수 있고, 다른 시스템과 호환 시에 강점을 보이며, 타입 구분을 간소화 할 수 있는 것이 장점이다.

문자열 타입

문자열 타입으로 지정한 column에 다른 타입의 데이터를 저장할 수 있지만, 이 경우 모두 문자로 취급된다.
MySQL의 경우 CHAR, VARCHAR, TEXT 타입을 사용할 수 있다.
OracleSQL의 경우 CHAR, VARCHAR2, CLOB, BLOB 타입을 사용할 수 있다.
CHAR 타입은 고정 길이, VARCHAR 타입은 가변 길이를 사용하는데, 해당 column에 저장되는 값의 길이가 고정이라면 CHAR 타입을, 길이가 변한다면 VARCHAR 타입을 사용하는 것이 성능 향상에 도움을 준다.

날짜, 시간 타입

날짜나 시간 타입은 숫자 타입과 마찬가지로, <, >, = 등의 연산이 가능해, WHERE절, ORDER BY 절에서 기준 column으로 사용 가능하다.
MySQL은 DATE, DATETIME, TIME, YEAR 타입을 사용할 수 있다.
또한, 날짜 형식에 관계 없이 입력이 자유로운 편이다.
OracleSQL은 DATE, TIMESTAMP 타입을 사용할 수 있다.
날짜 형식을 입력할 때는, TO_DATE 를 사용해 포맷 마스크를 지정해주어야 한다.

BOOLEAN 타입

True, False 값만 취급하는 BOOLEAN 타입이 존재한다.
Oracle SQL에는 BOOLEAN 타입이 없고, MySQL에서는 BOOLEAN타입을 사용할 수 있다.
값을 저장할 때는 1과 0으로 저장한다.

저장할 수 있는 데이터에 제약 설정

테이블의 컬럼에 제약을 걸어, 저장할 수 있는 데이터에 제한을 두거나, 속성을 붙여 규칙을 지정할 수 있다.
제약, 속성을 사용하면 생기는 이점은 다음과 같다.

  1. 불법적인 데이터가 입력되는 것을 막는다.
  2. 데이터의 일관성이 깨지는 것을 대부분 막을 수 있다.
  3. 데이터를 관리하기 쉬워진다.

대표적인 제약, 속성은 다음과 같다.

  1. NOT NULL - NULL 값을 입력하는 것을 막는다.
  2. UNIQUE - 다른 레코드의 값과 동일한 값을 저장할 수 없다.
  3. DEFAULT - 해당 column에 값을 저장하지 않으면 미리 선언해 둔 기본값이 저장된다.
  4. AUTO_INCREMENT - 자동으로 순번을 입력한다.

초깃값 설정

값이 입력되지 않을 때 저장할 값을 설정하려면 DEFAULT 명령어를 사용하면 된다.

  • CREATE TABLE SWITCH (BTN NUMBER(1) DEFAULT 1);
    => BTN COLUMN을 가진 SWITCH 테이블을 생성한다. BTN COLUMN은 1의 길이를 가진 NUMBER 타입이고, DEFAULT 값으로 1을 가진다.

NULL

컬럼의 값이 NULL로 표시될 때는, 데이터가 아무것도 들어있지 않다는 표시이다.
숫자 0 값이나 문자 ''과 구별된다.
집계합수나 WHERE절을 NULL 값이 존재하는 COLUMN을 기준으로 사용한다면, NULL 값인 레코드는 제외하고 집계하거나 조건 계산에서 제외한다.
단, IS NULL 조건을 사용할 경우 NULL 값만 조회한다.
데이터가 IS NULL인 레코드의 수를 구하려면 다음 쿼리처럼 사용하면 된다.
- SELECT COUNT() FROM { 테이블 이름 } WHERE { 구하려는 COLUMN } IS NULL;
=> 구하려는 COLUMN이 NULL값을 가지고 있는 모든 레코드의 수를 집계한다. COUNT(
)을 사용하는 이유는 COUNT({ 구하려는 COLUMN })을 사용할 경우 해당 레코드의 값이 NULL이기 때문에 집계가 되지 않기 때문이다.

UNIQUE

한 컬럼에 같은 값이 존재하지 않아야 한다면, UNIQUE 명령어를 사용하면 된다.
- CREATE TABLE USERS (ID VARCHAR2(20) UNIQUE);
=> ID COLUMN을 가진 USERS 테이블을 생성한다. ID COLUMN은 20의 길이를 가진 문자열 타입이고, 동일한 값이 존재하지 않는다.
값이 NULL인 레코드에는 적용되지 않는다.

AUTO_INCREMENT

레코드에 자동으로 번호를 입력하려면 AUTO_INCREMENT 명령어를 사용하면 된다.
- CREATE TABLE USERS (ID INT AUTO_INCREMENT);
=> ID COLUMN을 가진 USERS 테이블을 생성한다. ID COLUMN은 가진 숫자 타입이고, 값을 입력하지 않아도 자동으로 증가된 숫자가 입력된다.

PRIMARY KEY

다른 레코드와 중복되는 값이나 NULL값을 저장할 수 없게 하려면 PRIMARY KEY 명령어를 사용하면 된다.
- CREATE TABLE USERS (ID INT PRIMARY KEY);
=> ID COLUMN을 가진 USERS 테이블을 생성한다. ID COLUMN은 가진 숫자 타입이고, 중복되는 값이나 NULL 값을 입력할 수 없다.

FOREIGN KEY

테이블 연결을 위해 다른 테이블의 값에 의존하는 컬럼을 만들려면 FOREIGN KEY 명령어를 사용하면 된다.

  • CREATE TABLE { 테이블 이름 } ({ FK로 설정할 COLUMN } { 속성 }, FOREIGN KEY ({ FK로 설정할 COLUMN }) REFERENCE { 연결할 테이블 이름(연결할 COLUMN) });
    FK 설정을 할 경우, 연결된 KEY의 레코드에 없는 데이터를 저장할 수 없다.

트랜잭션

연속해서 여러 개의 데이터를 추가/갱식/삭제 해야 할 경우 하나의 하나의 액션으로 처리할 수 있게 묶는 것을 트랜잭션이라 한다.
트랜잭션을 실행하려면 다음 명령어를 사용하면 된다.

  • START TRANSACTION;
    트랜잭션의 특징
  1. 원자성 - 한 트랙잭션에 포함된 처리는 모두 실행되거나 모두 실행되지 않는다.
  2. 일관성 - 미리 설정된 조건을 충족하고 데이터의 정합성을 보장한다.
  3. 독립성 - 처리 도중의 경과가 은폐되고, 처리 실행 도중의 상태는 다른 처리에 영향을 주지 않는다.
  4. 영속성 - 트랜잭션이 완료되면 그 결과는 손실되지 않는다.

COMMIT

트랜잭션 내부의 모든 처리가 완료되었을 때, 결과를 반영하기 위해서는 COMMIT 명령어를 사용해야 한다.
COMMIT 명령어를 실행하지 않으면, 트랜잭션이 완료되지 않기 때문에, 데이터의 변경이 데이터베이스에 반영되지 않는다.

ROLLBACK

트랜잭션 내부에 문제가 생겼을 때, 처리를 취소하고 트랜잭션 시작 시점까지 되돌리기 위해서는 ROLLBACK 명령어를 사용해야 한다.
트랜잭션 도중 처리에 문제가 생기면, 데이터 정합성을 확보할 수 없게 될 수 있다. 이를 방지하기 위해 ROLLBACK 명령어를 사용해 무결성이 유지된 상태, 즉 트랜잭션 실행 이전 시점으로 복구한다.
ROLLBACK 명령어를 사용할 경우, 데이터베이스 상에서 변화는 존재하지 않는다.

DEADLOCK

복수의 트랜잭션 처리가 동시에 같은 데이터를 조작할 경우, 서로 상대의 처리 종료 시점까지 대기하기 때문에 다음 처리가 진행되지 않는다. 이를 DEADLOCK이라고 부른다.
이 문제를 해결하기 위해서는, 한 쪽의 처리를 종료해야 한다.
DBMS 자체에서 DEADLOCK을 감시해 ROLLBACK하기도 하지만, 애초에 DEADLOCK이 일어나지 않게 하는 것이 중요하다.
DEADLOCK이 일어나지 않게 하는 방안에는 다음 외에도 여러 방안이 있다.

  1. 모든 프로세스가 자원을 동일 순서로 요청하게 한다.
  2. 일정 시간이 지나면 보유한 자원을 포기하고 다시 시도하게 한다.
  3. 프로세스가 실행되기 전 모든 자원을 할당받게 한다.