데이터 베이스란?
데이터 베이스는 방대한 데이터를 체계적으로 저장, 관리, 검색할 수 있도록 도와주는 기술.
단순한 저장소를 넘어 데이터의 무결성을 유지하고, 효율적인 검색과 처리를 가능하게 하고, 복잡한 데이터 구조를 논리적으로 표현할 수 있는 도구.
데이터 베이스의 종류
관계형 데이터베이스 (Relational Database)
MariaDB , MySQL , PostSQL, OracleDB , Microsoft SQL Server
데이터와 데이터간 관계를 정의하는 구조를 가진다.
행(Row)와 열(Column)로 이루어져 있다. SQL을 사용해서 다룰 수 있다.
NoSQL 데이터 베이스
MongoDB(문서형), Redis(키-값)
비관계형 db로 sql을 사용하지 않고 당양한 데이터 모델을 지원하여 관리한다.
주로 비정형 데이터를 효율적으로 처리 가능하고 고성능, 높은 확장성을 제공하는 것이 특징이다.
문서, 키-값, 열, 그래프 등 다양한 형태로 데이터를 저장한다.
객체지향 데이터 베이스(Object-Oriented Database)
객체지향 프로그래밍의 개념을 db에 적용한 시스템.
객체와 객체 간의 관계를 저장하고, 관리한다.
복잡한 구조를 관리하는데 유리하고, 상속, 다형성 등 개념을 db에서도 사용가능하다,
그래프 데이터베이스(Graph Database)
노드(Node), 간선(Edge), 속성(Property)으로 구성된 그래프 구조를 기반으로 데이터를 저장 관리한다.
복잡한 관계와 연결성을 가진 데이터를 처리하는데 적합하며, 소셜네트워크, 추천시스템, 경로 탐색 등에서 유용하게 사용된다.
분산 데이터베이스(Distributed Database)
여러 네트워크에 분산된 db를 하나의 통합된 db처럼 관리하는 db 시스템이다.
고가용성, 확장성, 성능 향상을 목표로 한다. 클리우드 환경에서 자주 사용되고 대규모 데이터 처리와 실시간 데이터 접근에 적합하다.
데이터베이스 관리 시스템 (DBMS)
db를 생성하고 관리하며 조작할 수 있게 해주는 소프트웨어
db에 대해 데이터의 저장,검색,수정,삭제 등의 작업을 지원하고 데이터를 효율적으로 사용할 수 있도록 지원한다.
DB는 데이터 저장소, DBMS는 그 데이터를 관리하고 조작하는 도구
주요 기능
- 동시성 제어 : 여러 사용자가 동시에 데이터베이스에 접근하여도 데이터의 일관성을 유지
- 무결성 유지 : 데이터의 정확성과 신뢰성을 보장. ex) 잘못된 데이터가 저장되는 것을 방지
- 보안관리 : 권한을 통해 특정 사용자만 db에 접근 가능하도록 설정
- 백업과 복구 : 데이터 손실 시 복구할 수 있는 기능을 제공
관계형 데이터베이스 시스템 (RDBMS)
스키마
데이터 베이스에서 데이터 구조와 제약 조건을 정의한 것. 테이블, 뷰, 인덱스, 권한 등 데이터 베이스의 객체들이 어떻게 구성될지를 명세
테이블
행과 열로 구성. 데이터를 모아놓은 표라고 생각하면 됨.
행 : 튜플, 레코드. 차수: 속성의 개수
열 :
키
기본키(Primary Key)
주키라고도 불리며 테이블에서 각 행을 고유하게 식별할 수 있는 열이다.
기본키는 중복된 값이나 Null 값을 허용하지 않으며, 각 행을 유일하게 식별해야한다.
왜래키(Foreign Key)
한 테이블의 열이 다른 테이블의 기본 키를 참조하는 제약 조건.
테이블 간 관계를 정의하고 참조 무결성을 보장한다.
참조 무결성 : 왜래 키로 참조된 데이터가 항상 유요하게 유지되도록 하는 것
ex) 두 테이블 A와 B가 있을 때, B 테이블의 어떤 열이 A 테이블의 기본 키(Primary Key)를 참조한다면, B 테이블에 들어가는 외래 키 값은 반드시 A 테이블에 존재하는 값이어야 한다.
유니크 키(Unique Key)
열의 값이 테이블 내에서 중복되지 않도록 보장하는 제약조건
기본키와 비슷하지만 Null값을 허용하는 차이점 존재.
복합 키(Composite Key)
두개 이상의 열을 조합하여 테이블의 각 행을 고유하게 식별하는 키
행(Row)
데이터 베이스의 기본 구성 단위로 저장된 실제 데이터를 나타냄 튜플(Tuple)라고 불린다.. ex) 실제 사용자의 정보들
열(Column)
데이터의 특정 속성을 나타냄 ex) 카테고리 분류 : 이름, 번호, id, 주민등록번호 ...
데이터 타입 정수(INT), 문자열(CHAR), 날짜(DATE)등이 존재
열에는 제약조건(Constraint) 및 인덱스(index)를 설정할 수 있다.
제약조건
데이터 베이스에서 데이터의 무결성과 일관성을 보장하기 위해 설정하는 규칙
제약조건은 데이터가 테이블에 삽입, 수정, 삭제될 때 데이터의 정확성과 일관성을 유지하도록 돕는다.
-> 이상현상이 발생하지 않도록 한다.
기본 키 제약조건
기본 키는 중복된 값이나 NULL 값을 허용하지 않는다.
외래 키 제약조건
한 테이블의 열이 다른 테이블의 기본 키를 참조하도록 설정한다.
유니크 제약조건
열의 값이 테이블 내에서 중복되지 않도록 보장. 기본키는 자동으로 유니크 제약조건을 가진다.
데이터의 중복을 방지하고, 특정 열의 값이 유일하도록 유지
Null 제약조건
열이 NULL 값을 가질 수 없도록 설정합니다. 이 제약조건은 데이터가 반드시 존재해야 하는 열에 적용
기본값 제약조건
명시적으로 값이 제공되지 않을 때 사용할 기본값을 설정
검사 제약조건(Check Constraint)
열의 값이 특정 조건을 만족해야 한다고 설정
이 제약조건은 데이터가 특정 규칙을 따르도록 강제
인덱스(INDEX)
데이터 검색의 성능을 향상시키기 위해 사용되는 구조. 특정 열에 대해 생성되어, 해당 열의 값고 그에 대응하는 데이터의 위치를 효율적으로 매핑한다. 이를 통해 DB는 쿼리 실행시 테이블의 전체 스캔 없이 인덱스를 통한 데이터 접근이 가능하다.
하지만 인덱스를 생성하고 유지하는데 추가적인 저장 공간이 필요하고 데이터 삽입, 수정, 삭제 시 인덱스도 함께 갱신해야 하므로 성능 오버헤드가 발생할 수 있다.
오버헤드 : 인덱스를 생성하고 유지하는 과정에서 발생하는 추가적인 처리 비용을 의미.
구체적으로 오버헤드는 성능에 부담을 주는 추가 작업이나 추가적인 자원 소모를 가리킨다.
SQL
RDBMS에서 데이터정의 조작 제어, 검색을 수행하는데 사용되는 표준화된 프로그래밍 언어
DESC [테이블 이름]; // 테이블의 구조(스키마) 확인데이터 정의 언어 (DDL)
주요 목적은 DB의 객체를 생성, 수정, 삭제하는 것
CREATE TABLE 테이블이름(필드이름 TYPE 제약조건, ... KEY (필드이름) REPERENCES target_tb(필드이름) ) ;
ex )
CREATE TABLE Users (
user_id INT NOT NULL,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(100) NOT NULL,
email VARCHAR(100),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (user_id),
FOREIGN KEY (email) REFERENCES EmailList(email) -- 예시로 외래키 설정
);
테이블 생성시 부여 가능 옵션
AUTO_INCREMENT
NOT NULL
UNIQUE
DEFAULT
CHECK
PRIMARY KEY
FOREIGN KEY- AUTO_INCREMENT: 숫자형 컬럼(Column)에 고유한 값을 증가시켜 삽입할 때 사용. 주키(Primary Key)에 주로 사용.
- NOT NULL: 해당 컬럼(Column)에 null값을 허용하지 않는다.
- UNIQUE: 컬럼(Column)에 저장된 값이 테이블 내에서 고유한 값이 되도록 보장. 이 옵션이 추가되면 중복된 로우(Row)을 허용하지 않는다.
- DEFAULT: 컬럼(Column)의 기본 값을 지정. 만일 INSERT 구문에서 값이 없이 로우(Row)이 추가되었다면 기본값을 채워 추가.
- CHECK: 추가되는 로우(Row)의 컬럼(Column)의 값이 CHECK의 조건에 해당하는지 확인.
- PRIMARY KEY: 테이블의 주키가 될 컬럼(Column)을 설정.
- FOREIGN KEY: 다른 테이블의 주키(Primary Key)를 참조하여 두 테이블 간의 관계(Relation)를 설정.
DROP TABLE 테이블이름;ALTER TABLE [테이블 이름] ADD COLUMN [컬럼 이름] [자료형] [옵션];
ALTER TABLE [테이블 이름] MODIFY COLUMN [컬럼 이름] [자료형] [옵션];
ALTER TABLE [테이블 이름] CHANGE COLUMN [이전 컬럼 이름] [변경할 컬럼 이름] [자료형] [옵션];
ALTER TABLE [테이블 이름] DROP COLUMN [컬럼 이름];
ALTER TABLE [테이블 이름] RENAME [변경할 테이블 이름];- ADD COLUMN : 테이블에 컬럼을 추가
- MODIFY COLUMN : 테이블의 컬럼 명세를 변경.
- CHANGE COLUMN : 테이블에 컬럼 명세를 이름과 함께 변경.
- DROP COLUMN : 테이블의 컬럼을 삭제.
- RENAME COLUMN : 테이블 이름을 변경.
특정 테이블의 모든 데이터를 삭제하지만 테이블의 구조는 유지하는 명령어
TRUNCATE TABLE 테이블이름;데이터 조작 언어 (DML)
SELECT 필드이름 [as 별칭], FROM 테이블이름 [CONDITIONS];
SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름
WHERE 조건;INSERT INTO 테이블이름 (필드이름1, 필드이름2, ...)
VALUES (값1, 값2, ...);
INSERT INTO [테이블 이름] VALUES (값1, 값2, 값3, ...);
INSERT INTO [테이블 이름] (컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...);
INSERT INTO [테이블 이름] SET [컬럼1] = [값1], [컬럼2] = [값2] ... ;- 첫번째 방식을 사용할 때에는 VALUES 에 기재하는 값들의 순서를 열의 순서와 동일하게 하여야 한다. 생략된 열이 있다면 DEFAULT나 NULL로서 값이 채워진다,
- 두번째 방식은 열과 값이 일치하게 기재하여야 한다. 생략된 열이 있다면 DEFAULT나 NULL로서 값이 채워진다,
- 세번째 방식은 특정 열에만 값을 추가할 때 유리. 생략된 열이 있다면 DEFAULT나 NULL로서 값이 채워진다,
UPDATE 테이블이름
SET 필드이름1 = 값1, 필드이름2 = 값2, ...
WHERE 조건;DELETE FROM 테이블이름
WHERE 조건;데이터 제어 언어 (DCL)
계정생성
CREATE USER 'ID'@'HOST' IDENTIFIED BY'PWD';
권한 부여
GRANT 권한 ON database.table TO 'ID'@'HOST'
권한 삭제
REVOKE 권한 ON database.table To 'ID'@'HOST'sql 실행 순서
5 SELECT [컬럼명]
1 FROM [테이블명]
2 WHERE [조건절]
3 GROUP BY [컬럼명] // 같은 그룹의 총 주문수
4 HAVING [그룹BY를 사용할 때의 조건절]
6 ORDER BY [컬럼명] [정렬방식]
7 LIMIT [오프셋]
FROM (1): 데이터가 어디서부터 가져올지 지정. 즉, 쿼리에서 사용할 테이블을 선택하는 단계.
WHERE (2): 데이터를 필터링하는 단계로, 테이블에서 조건에 맞는 행만 추출.
GROUP BY (3): 데이터를 그룹화하는 단계. 같은 값을 가진 컬럼을 기준으로 그룹을 만들어서, 각 그룹에 대한 집계 연산을 수행할 수 있게 한다. 예를 들어 "같은 그룹의 총 주문 수"처럼 그룹별로 데이터를 계산할 때 사용.
HAVING (4): GROUP BY로 그룹화된 데이터에 대한 추가 필터링 조건을 설정. WHERE와 달리, 그룹화된 결과에 조건을 적용하는 것이 특징.
SELECT (5): 지정한 컬럼들을 조회하고, 이 단계에서만 데이터를 실제로 선택해 보여준다.
ORDER BY (6): 조회된 데이터를 정렬한다. 컬럼명과 정렬방식(오름차순 ASC나 내림차순 DESC)을 지정할 수 있다.
LIMIT (7): 조회된 결과의 행 수를 제한하고, 오프셋을 설정하여 몇 번째부터 데이터를 가져올지 지정.
테이블 조인
INNER조인 (교집합) : 두 테이블에서 공통된 값을 가진 데이터만 조회
예: SELECT * FROM A INNER JOIN B ON A.id = B.a_id;
결과: 두 테이블에서 일치하는 행만 반환
left join or right join (차집합) :
- 왼쪽 테이블의 모든 행과 오른쪽 테이블에서 일치하는 행을 조회하며, 일치하지 않는 경우 NULL로 표시
- 오른쪽 테이블의 모든 행과 왼쪽 테이블에서 일치하는 행을 조회하며, 일치하지 않는 경우 NULL로 표시
예 :
SELECT FROM A LEFT JOIN B ON A.id = B.a_id;
SELECT FROM A RIGHT JOIN B ON A.id = B.a_id; - 왼쪽 테이블의 모든 데이터가 반환되며, 오른쪽 테이블에 매칭되지 않는 값은 NULL로 채워진다.
- 오른쪽 테이블의 모든 데이터가 반환되며, 왼쪽 테이블에 매칭되지 않는 값은 NULL로 채워진다.
FULL JOIN(FULL OUTER JOIN) (합집합) :
두 테이블의 모든 데이터를 포함하며, 일치하지 않는 데이터는 NULL로 표시.
예: SELECT * FROM A FULL OUTER JOIN B ON A.id = B.a_id;
두 테이블에 일치하는 데이터와 일치하지 않는 데이터를 모두 조회. 일치하지 않는 부분은 NULL이 채워진다.
트랜잭션 (ACID원칙)
트랜잭션은 DB의 하나의 논리적 작업 단위를 의미 여러 작업이 묶여 하나의 작업처럼 처리되는 것을 말함.
원자성 (Atomicity) : 전체다 성공하면 반영 , 실패하면 전체 다 실패 하지만 save포인트를 만들고 그 시점으로 롤백은 가능
ex) 여러 작업 중 중간에 오류가 발생하면, 트랜잭션 전체가 롤백되어 아무런 변화도 없는 상태로 복원.
일관성 (Consistency) : 트랜잭션이 실행되기 전과 후에 데이터베이스가 일관된 상태를 유지해야 한다.데이터베이스에 미리 정의된 규칙(제약 조건 등)을 항상 만족하도록 보장
ex) 송금 트랜잭션의 경우 A 계좌에서 돈이 빠져나가면 B 계좌에는 동일한 금액이 더해져야 한다.
고립성 (Isolation) : 트랜잭션 간에 서로의 작업이 독립적으로 실행되어야 하며, 중간 결과가 다른 트랜잭션에 영향을 주어서는 안된다.
ex) 두 사용자가 동시에 같은 상품을 구매할 때, 고립성이 보장되면 재고가 음수가 되는 상황이 발생하지 않는다.
지속성 (Durability) : 결과를 커밋해서 그 결과가 확정이 되었다면 데이터베이스에 확실하게 반영해서 영구적으로 적용되어야 한다.
ex) 회원가입을 했다면 휘발성이 되면 안된다.
트랜잭션 예시
회원 가입을 위한 트랜잭션에서, 새로운 사용자 정보를 데이터베이스에 삽입한 후 회원에게 환영 메일을 보내는 두 가지 작업이 트랜잭션으로 묶여 있을 수 있다. 두 작업이 모두 성공해야만 트랜잭션이 커밋되며, 하나라도 실패하면 전체 작업이 롤백되어 데이터베이스에 아무 변화도 남기지 않는다.
비관적인 락(잠금) vs 낙관적인 락(잠금)
비관적인 락
데이터에 대한 잠금을 통해 동시성 문제를 방지하는 접근 방식. 데이터의 수정 작업이 진행될 때.
다른 트랜잭션이 동일한 데이터에 접근하거나 수정하는 것을 방지하기 위해 잠금을 설정.
비관적 잠금은 트랜잭션이 데이터에 접근하거나 변경할 때 해당 데이터에 대한 잠금을 강제적으로 수행함으로써 데이터의 일관성을 유지하는 방식.
- 데이터에 대한 잠금을 트랜잭션이 수행하기 전부터 설정한다.
- 트랜잭션이 완료될 때까지 잠금을 유지.
단점 : 잠금을 유지하는 동안 다른 트랜잭션이 대기하게 되어 성능 저하가 발생할 수 있음. 교착상태가 발생할 수 있음유지하는 동안 다른 트랜잭션이 대기하게 되어 성능 저하가 발생할 수 있음. 교착상태가 발생할 수 있음
낙관적인 락
데이터 충돌이 발생하지 않을 것을 가정하에 동작하는 방식.
잠금을 설정하지 않고, 트랜잭션이 데이터를 읽고 수정한 후 변경 사항을 데이터베이스에 반영할 때 데이터 충돌여부를 확인.
충돌이 발생하지 않은 경우 데이터베이스에 반영.
이 방식은 데이터 충돌이 발생할 수 있으며, 충돌 발생 시 트랜잭션을 재시도 해야할 수 있다.
트랜잭션의 수가 많거나 데이터 충돌이 빈번하게 발생하는 경우, 성능저하가 발생할 수 있다.
'DataBase' 카테고리의 다른 글
| [오르미 백엔드 7기] (database 실습2) (7) | 2024.11.14 |
|---|---|
| [오르미 백엔드7기] (Database실습1, ERD) (0) | 2024.11.13 |