특정 조직의 여러 사용자가 공유하여 사용할 수 있도록 통합해서 저장한 운영데이터의 집합
사용자의 데이터 요구에 실시간으로 응답할 수 있어야 하며, → 실시간 접근성
동적인 특징이 있어 계속해서 변화하며 현재의 변화와 동기화 → 계속 변화
여러 사용자가 동시에 이용 가능한 동시 공유의 특징을 제공해야 하고, → 동시 공유
저장된 주소나 위치가 아닌, 데이터의 내용(값)으로 참조. → 내용으로 참조
과거에는 데이터를 관리하기 위해 파일 시스템을 이용했다. 각각의 서비스마다 파일을 따로 유지하고, 파일의 논리적인 구조뿐 아니라 물리적인 구조까지 정확히 파악해야한다. 그래서 다음과 같은 문제점들이 발생했다.
데이터베이스 관리 시스템
이러한 파일 시스템의 데이터 중복과 데이터 종속문제를 헤결하기 위해 제시된 소프트웨어. 데이터를 db에 통합하여 저장하고, 이에 대한 관리를 집중적으로 담당한다.
db생성과 접근, 관리를 모두 담당하고 손쉬운 인터페이스를 제공한다.
주요 기능
대신 단점으로는 높은 비용과, 백업과 회복 방법이 복잡함(장애 원인 판단이 어려움)을 들 수 있다.
db에 데이터를 저장하고, 저장된 데이터를 관리하여 조직에 필요한 정보를 생성해주는 시스템
데이터베이스 → 저장된 데이터의 집합
DBMS → db에 저장된 데이터가 일관되고 무결한 상태로 유지되도록 관리하는 역할
데이터베이스 시스템 → db와 DBMS를 이용하여 조직에 필요한 정보를 제공해주는 전체 시스템
스키마
db에 저장되는 데이터 구조와 제약조건
정의된 스키마에 따라 실제 db에 저장된 값 → 인스턴스
사용자의 관점에 따라 외부 스키마, 개념 스키마, 내부 스키마로 구분한다.
각 단계에서 추상
3단계 데이터베이스 구조
결국에는 위의 서로 다른 스키마들은 유기적으로 연결되어있어야 한다.
이렇게 데이터베이스를 3단계 구조로 나누고, 단계별로 스키마를 유지하며 스키마 사이의 대응 관계를 정의하는 궁극적인 목적은 데이터 독립성을 실현하기 위함이다.
키? 검색이나 정렬 시 tuple을 구분할 수 있는 기준이 되는 attribute
유일성(key로 하나의 tuple을 유일하게 식별)만 만족
유일성과 최소성(꼭 필요한 속성으로만 구성)을 만족하는 속성 또는 그 집합.
후보 키 중 선택된 Main 키
아래 조건을 만족해야한다.
유일성
최소성
개체 무결성
: Entity integrity is an integrity rule which states that every table must have a primary key and that the column or columns chosen to be the primary key should be unique and not null.(위키피디아(Data Integrity)서로 다른 table을 연결하기 위해 이용된 키
보통 다른 테이블의 primary key를 참조하게 된다.
외래키가 null일 수 있다. (관계가 없거나, 관계가 unknown임을 의미한다)
The referential integrity rule states that any foreign-key value can only be in one of two states. The usual state of affairs is that the _foreign-key value refers to a primary key value of some table in the database. Occasionally, and this will depend on the rules of the data owner, a foreign-key value can be null. In this case, we are explicitly saying that either there is no relationship between the objects represented in the database or that this relationship is unknown.(위키피디아(Data Integrity))_
해커에 의해 조작된 쿼리문이 데이터베이스에 그대로 전달되어 비정상적인 명령을 실행시키는 공력 기법
1) Incorrectly constructed SQL statements
SQL 문은 보통 data와 명령어로 구성되게 된다. 이 때 data를 user input으로 받는 경우가 생기는데 이 때 중간에 attacker가 data를 넣는 대신 명령어를 삽입하므로써 쿼리를 변화시키거나, 새로운 쿼리를 추가할 수 있다.
→ 한 번에 하나의 statement만 실행시킴으로써 새로운 쿼리를 추가하는 것을 막을 수 있다. but 이 방법으로는 쿼리 수정은 못막음
2) Blind SQL Injection
에러 메시지를 이용하여 공격하는 방법이다.
인위적으로 에러를 발생시키고, 오류 메시지를 통해 db 구조를 유추하여 해킹에 활용한다.
1) input 값을 받을 때 특수 문자 여부 검사하기
2) SQL 서버 오류 발생시 에러 메시지에 유저가 접근할 수 없도록
3) prepare statement 사용하기
4) ORM 을 이용하기
5) Parameterized statements(prepared statement): placeholder를 이용 → placeholder에는 SQL 문 못들어가고 정해진 타입의 값만 들어갈 수 있도록
조인
1) INNER JOIN
2) LEFT OUTER JOIN
3) RIGHT OUTER JOIN
4) FULL OUTER JOIN
5) SELF JOIN
6) CROSS JOIN
SQL
NoSQL
데이터의 상태를 변화시키기 위하여 수행하는 작업 단위
Commit
: 하나의 트랜잭션이 성공적으로 끝났고, DB가 일관성 있는 상태임을 알려주기 위해 사용RollBack
: 하나의 트랜잭션 처리가 비정상적으로 종료되었을 때 last consistent state로 되돌아간다.에러 등의 상황에서도 데이터가 유효할 수 있도록 database transaction
이 보장해야 하는 네 가지 properties
Atomicity: 각각의 transaction은 하나의 unit
으로 동작하여야 함. 모두 함께 시행되던가, 아예 시행되지 않던가. 일부만 시행되는 것이 안된다는 것. 완전하게 시행되는 것에 실패하면 RollBack을 통해 트랜잭션 이전의 상태로 DB를 되돌린다. transaction이 실행중에 있을 때 다른 database client에 의해 접근되는 것도 막는다.
Consistency: transaction이 항상 valid Database를 유지하도록 한다. (모든 데이터들이 constraints, cascade 등의 룰을 모두 따르도록) illegal 한 transaction의 접근을 막는다.
Isolation: transaction이 동시에 실행될 때, 순차적으로 실행될 때와 같은 결과를 전달해야 한다.
Durability: commit
이 완료된 트랜잭션은 어떤 상황에서도 계속해서 commit 상태로 남아있어야 한다. → 휘발적이지 않은 메모리에 completed transaction(또는 그 결과)을 저장해야 한다.
ACID property 중 하나인 isolation은 가끔 relaxed 된다. level이 높아질수록 concurrency가 낮아지고, deadlock 가능성이 높아진다.
phenomena
이러한 세 현상의 유무에 따라 트랜잭션 격리 수준을 네가지로 나눌 수 있다
Reference-Microsoft doc(Transaction Isolation Level)
write-lock
이 걸려있는 동안에는 접근하지 않는다. →"dirty data"에 접근하는 것을 막는다.다른 row로 옮겨갔을 때 read-lock
을 풀어주고, write-lock
은 commit / rollback 전까지는 가지고 있는다.
write-lock
이 걸려있는 동안에는 접근하지 않는다.추가로 Write skew(복수가 한번에 같은 column을 수정)가 일어날 수 있다.
잘못된 테이블 설계로 인하여 이상현상이 일어날 수 있다.
1. 삽입이상
불필요한 데이터를 추가해야 삽입이 가능한 상황
갱신 이상
중복된 데이터를 저장하는 부분이 발생하여 하나의 row를 변경하였을 때 data inconsistency가 발생.
삭제 이상
튜플 삭제로 인해 꼭 필요한 데이터가지 함께 삭제됨
Reference(SOPT 27기 서버 세미나 자료)
주로 관계형 데이터베이스에서 불필요한 중복 데이터를 제거하고, 이상 현상을 방지하기 위해 db를 구조화하는 것을 말한다.
1차 정규화
각 column이 하나의 값만을 가져야 한다.
2차 정규화
두개의 복합키가 primary key일 때 각각의 키에 모두 dependent해야함. 둘 중 하나에만 dependent하면 부분적으로 dependent하게 된다. 2차정규화는 후보키가 아닌 속성들이 후보키 부분이 아니라 전체에 dependent한 것을 말한다.
3차 정규화
기본키가 아닌 일반 열에 의존하는 열을 제거하는 것
정규화된 db에서 효율을 높이기 위해 이용된다. 중복된 데이터를 추가하거나, data를 그룹화함으로써 write performance를 희생하여 read performance를 향상시킨다.