데이터베이스의 발전
- 1960년대 : 플로우차트 중심의 개발. 파일 구조를 통해 데이터를 저장/관리함.
- 1970년대 : 데이터베이스 관리 기법이 태동되던 시기. 계층형Hierarchical 데이터베이스, 망형Network 데이터베이스 같은 제품들이 상용화 됨.
- 1980년대 : 현재 대부분의 기업에서 사용되고 있는 관계형 데이터베이스가 상용화. Oracle, Sybase, DB2 등 등장함.
- 1990년대 : 보다 향상된 기능의 많은 DB 제품으로 정보시스템의 확실한 핵심 솔루션으로 자리잡음. 인터넷 환경의 급속한 발전과 객체 지향 정보를 지원하기 위해 객체 관계형 데이터베이스로 발전.
관계형 데이터베이스Relational Database의 등장
관계형 데이터베이스 1970년 영국의 수학자였던 E.F. Codd 박사의 논문에서 소개되었다. 이는 릴레이션Relation과 릴레이션의 조인 연산을 통해 합집합, 교집합, 차집합 등을 만들 수 있다. 현재 기업에서 가장 많이 사용하는 데이터 베이스로, Oracle, MS-SQL, MySQL, Sybase 등 다양한 DBMS가 있다.
DB는 데이터를 어떤 형태의 자료구조로 사용하느냐에 따라 나뉜다: 계층형, 네트워크형, 관계형 DB 등. 계층형 데이터베이스는 트리 형 자료구조에 데이터를 저장, 관리하며 1대 N 관계를 표현한다. 네트워크형은 오너와 멤버 형태로 데이터를 저장하며 1대N, M대N 표현도 가능하다. 관계형 데이터베이스는 릴레이션에 데이터를 저장, 관리하며 릴레이션을 사용해서 집합/관계 연산도 가능하다.
파일시스템은 분산된 데이터 사이 정합성을 보장하기 힘들다(단, 단일 사용자/단일 어플리케이션이 파일시스템을 사용하는 경우 데이터베이스보다 처리 성능이 뛰어나므로 특정 업무에서는 아직도 파일시스템을 유용하게 사용한다). 반면 관계형 데이터베이스는 정규화를 통한 합리적인 테이블 모델링을 통해 이상 현상을 제거하고 데이터 중복을 피하며, 동시성 관리, 병행 제어를 통해 많은 사용자들이 동시에 데이터를 공유/조작할 수 있는 기능을 제공한다. 또 메타 데이터를 총괄 관리할 수 있기 때문에 데이터의 성격, 속성 또는 표현 방법 등을 체계화할 수 있고 데이터 표준화를 통한 데이터 품질을 확보할 수 있는 장점을 가진다.
그리고 DBMS는 인증된 사용자만이 참조할 수 있도록 하는 보안 기능을 제공한다. 테이블 생성 시 사용할 수 있는 다양한 제약조건을 이용하여, 사용자가 실수로 조건에 위배되는 데이터를 입력하거나 관계 연결에 중요 데이터를 삭제하는 것을 방지하여 데이터 무결성Integrity을 보장할 수 있다. 추가로 갑작스런 장애로부터 사용자가 입력/수정/삭제하던 데이터가 제대로 반영될 수 있도록 보장해주는 기능과, 시스템 다운, 재해 등의 상황에서도 데이터를 회복/복구할 수 있는 기능도 제공한다.
관계형 데이터베이스의 집합 연산과 관계 연산
집합 연산 | 설명 |
합집합Union | 두 릴레이션을 하나로 합한다. 중복된 행(튜플)은 한 번만 조회된다. |
차집합Difference | 원래 릴레이션에는 존재하고 다른 릴레이션에는 존재하지 않는 것을 조회한다. |
교집합Intersectinon | 두 릴레이션 사이 공통된 것을 조회한다. |
곱집합Cartesian product | 각 릴레이션에 존재하는 모든 데이터를 조합하여 연산한다. |
관계 연산 | 설명 |
선택 연산Selection | 릴레이션에서 조건에 맞는 행(튜플)만을 조회한다. |
투영 연산Projection | 릴레이션에서 조건에 맞는 속성만을 조회한다. |
결합 연산Join | 여러 릴레이션의 공통된 속성을 사용해 새로운 릴레이션을 만들어 낸다. |
나누기 연산Division | 기준 릴레이션에서 나누는 릴레이션이 가진 속성과 동일한 값을 가지는 행(튜플)을 추출하고 나누는 릴레이션의 속성을 삭제한 후 중복된 행을 제거한다. |
TABLE
관계형 데이터베이스는 릴레이션에 데이터를 저장하고 릴레이션을 사용해서 집합/관계 연산을 지원하므로 다양한 형태로 데이터를 조회할 수 있다. 릴레이션은 최종적으로 DBMS에, 테이블Table로 만들어진다.
K-League에 등록된 팀들의 정보와 선수들에 관련된 데이터에 관심을 두고, 선수정보를 데이터베이스화 한다고 가정하자. 다음은 K-리그 구단 홈페이지를 방문하여 팀 및 선수들의 정보를 찾아서 선수들의 이름과 소속 구단, 포지션, 생년월일, 키, 몸무게, 등번호를 노트에 적어본 것이다. 참고로 본 데이터는 팀명이나 일부 실명이 포함되어 있지만 전체적으로는 가공의 데이터이다.
별도의 정리 작업을 하지 않은 위 그림의 왼쪽 내용은 본인이 아니라면 알아보기도 힘들고 다른 사용자에게 별로 도움이 되지도 못한다. 그러나 오른쪽을 보면, 선수별로 정보가 정리되어 관심있는 다른 사용자에게도 도움이 될 수 있다. 하지만 오른쪽 역시 한 두명의 선수에 대해서는 정리가 되는 듯 보이지만 많은 선수들의 정보를 비교하기에는 어렵다. 도움이 되지 않는다. 그러나 오른쪽의 내용은 선수별로 필요한 정보가 정리되어 관심 있는 다른 사용자에게 도움이 될 수 있다.
데이터는 관계형 데이터베이스의 기본 단위인 테이블의 형태로 저장된다. 모든 자료는 테이블에 등록되고, 우리는 테이블로부터 원하는 자료를 꺼내올 수 있다. 테이블은 어느 특정한 주제, 목적으로 만들어지는 일종의 집합이다. 위의 표처럼 K-리그 선수들의 정보를 한의 표에서 정리한다면, 좋아하는 선수들의 상세 정보를 이 표 하나를 통해 볼 수 있고 다른 정보와 비교할 수도 있다. 새로운 선수를 입력할 땐 새로운 테이블을 생성할 필요없이 데이터만 추가하여 정보를 관리할 수도 있다.
위 표를 보면 선수, 팀, 팀연고지, 포지션, 등번호, 생년월일, 키, 몸무게가 각각의 칼럼이 되며 해당 테이블은 반드시 하나 이상의 칼럼을 가진다. 예를 들어 '이청용' 선수에 대한 정보는 아래와 같이 8개 칼럼을 가지는 하나의 로우로 데이터화 되어 테이블에 저장되었다.
앞서 본 것처럼 테이블에는 등록된 자료들이 있고, 이 자료들은 삭제하지 않는 한 유지된다. 만약 우리가 자료를 입력/수정하지 않는다면 테이블은 본래 만들어졌을 때부터 가진 속성을 그대로 유지하며 존재한다.
테이블에 대해서 좀 더 상세히 살펴보면, 테이블은 데이터를 저장하는 객체로서 관계형 데이터베이스의 기본 단위이다. 관계형 데이터베이스에서는 모든 데이터를 칼럼과 로우(또는 튜플), 2차원 구조로 나타낸다. 세로 방향을 칼럼, 가로 방향을 로우라고 하고, 칼럼과 로우가 겹쳐지는 하나의 공간을 필드Field(또는 속성)라고 한다. 선수정보 테이블을 예로 들면 선수명, 포지션 등의 칼럼이 있고 각 선수에 대한 데이터를 로우로 구성해 저장하는 것이다.
선수와 관련된 데이터를 저장할 때 모든 데이터를 하나의 테이블로 저장하지는 않는다. 아래 그림을 보면 선수와 관련된 데이터를 선수 테이블과 구단 테이블이라는 복수의 테이블로 분할하여 저장하고 있다. 그리고 분할된 테이블은 그 칼럼의 값에 의해 연결된다. 이렇게 테이블을 분할하여 데이터의 불필요한 중복을 줄이는 것을 정규화Normalization라고 한다. 데이터 정합성의 확보와 데이터 입력/수정/삭제시 발생할 수 있는 이상현상Anomaly을 방지하기 위해 정규화는 관계형 데이터베이스 모델링에서 매우 중요한 프로세스이다.
각 행(!)을 한 가지 의미로 특정할 수 있는 한 개 이상의 칼럼을 기본키Primary Key라고 하며, 여기서는 선수 테이블의 ‘선수번호’와 구단 테이블의 ‘팀 코드’가 PK이다. PK는 한 테이블에서 유일성과 최소성을 만족하면서 해당 테이블을 대표한다. 또 선수 테이블의 ‘팀 코드’와 같이 다른 테이블의 기본 키로 사용되면서 테이블과의 관계를 연결하는 칼럼을 외부키Foreign Key라고 한다. FK는 관계 연산 중 결합 연산(Join)을 위해 사용된다.
SQL(Structured Query Language)
SQL은 관계형 DB에서 데이터 정의/조작/제어를 위해 사용하는 절차형 언어이다. 관계형 DB는 DB를 연결하고 SQL문을 사용하여 누구나 DB를 쉽게 다룰 수 있도록 한다. SQL 교육은 정확한 데이터를 출력하는 것이 목표이고, 시스템에 큰 영향을 주는 SQL을 가장 효과적(응답시간, 자원 활용 최소화)으로 작성하는 것이 SQL 튜닝의 목표이다.
사용자는 특정 데이터들의 집합에서 필요로 하는 데이터를 꺼내서 조회하고 새로운 데이터를 입력/수정/삭제하는 행위를 통해서 데이터베이스와 대화한다. 그리고 SQL은 이러한 대화를 가능하도록 하는 매개(전담 접속 매개)이다. 결과적으로 SQL 문장을 배우는 것이 곧 관계형 데이터베이스를 배우는 것이다.
1986년부터 ANSI/ISO를 통해 표준화되고 정의된 SQL 기능은 벤더별 DBMS 개발의 목표다. 각 벤더의 관계형 데이터베이스RDBMS는 표준화된 SQL 이외에도 벤더 차별화 및 이용 편리성을 위해 추가 기능이나 내장 함수 등에서 독자적 개발을 계속 진행하고 있다. 상호 호환성이 뛰어난 표준 기능과, 벤더별 특징을 가지고 있는 독자적 기능 중 어떤 기능을 선택할 지는 사용자의 몫이지만 가능한 ANSI/ISO 표준을 기준으로 할 것을 권고한다.
SQL 표준 | 설명 |
ANSI/ISO SQL 표준 | INNER JOIN, NATURAL JOIN, USING 조건, ON 조건절 사용 |
ANSI/ISO SQL3 표준 | DBMS 벤더별로 차이가 있던 SQL을 표준화하여 제정 |
SQL 종류
이들 SQL 명령어는 3가지 SAVEPOINT 그룹인 DDL, DML, DCL로 나눌 수 있는데, TCL의 경우 굳이 나눈다면 일부에서 DCL로 분류하기도 하지만, 다소 성격이 다르므로 별도의 4번째 그룹으로 분리하겠다.
작업의 순서: DCL(권한 부여) - DDL (데이터 구조 정의) - DML(데이터 조회 등)
DDL문은 DB 테이블을 생성하거나 변경, 삭제하는 것으로 데이터를 저장할 구조를 정의한다. DML은 데이터 구조가 DDL로 정의된 후 해당 데이터 구조에 따라 데이터를 입력/수정/삭제/조회하는 언어이다. DCL은 DDL로 정의된 구조에 어떤 사용자가 접근할 수 있는지에 대한 권한을 부여하는 언어다.
트랜잭션Transaction의 특성
트랜잭션은 DB의 작업을 처리하는 단위이다.
트랜잭션의 특성 | 설명 |
원자성Atomicity | DB 연산의 전부또는 일부(ALL OR NOTHING) 실행만이 있다. 트랜잭션의 처리가 완전히 끝나지 않았을 때는 전혀 이루어지지 않은 것과 같아야 한다. |
일관성Consistency | 트랜잭션 실행 결과로 DB 상태에 모순이 없고, 실행 후에도 일관성이 유지되어야 한다. |
고립성Isolation | 트랜잭션 실행 중 생성하는 연산의 중간 결과는 다른 트랜잭션이 접근할 수 없다(부분적인 실행 결과를 다른 트랜잭션이 볼 수 없다). |
연속성Durability | 트랜잭션이 그 실행을 성공적으로 완료하면 그 결과는 영구적으로 보장되어야 한다. |
SQL문의 실행 순서
개발자가 작성한 SQL문(DCL, DDL, DML)은 3단계를 걸친다. 문법 검사, 구문 분석 이후에 SQL이 실행되며 실행 후 데이터를 인출한다.
SQL 실행 순서 | 설명 |
파싱Parsing | SQL문의 문법을 확인하고 구문을 분석한다. 구문 분석이 된 SQL문은 Library Cache에 저장된다. |
실행Execution | 옵티마이저가 수립한 실행 계획에 따라 SQL을 실행한다. |
인출Fetch | 데이터를 읽어서 전송한다. |
ERD(Entity Relationship Diagram)
팀과 선수의 관계를 보자. 팀 정보와 선수 정보 간은 물론 다른 테이블과도 이들은 어떤 의미의 연관성이나 관계를 가진다. ERD는 이와 같은 관계의 의미를 직관적으로 표현할 수 있는 좋은 수단이다.
위처럼 팀과 선수 사이에는 '소속'이라는 관계가 맺어져 있다. 테이블간 서로의 상관 관계를 그림으로 도식화한 것을 ERD라고 한다. ERD의 구성 요소는, 엔터티Entity, 관계Relationship, 속성Attribute, 3가지 이며 현실 세계의 데이터는 이 3가지 구성 요소로 모두 표현 가능하다.
아래는 앞으로 사용하게 될 K-리그의 테이블 관계를 표현한 ERD이다.
K-리그 테이블 간의 양방향 관계는 다음과 같다.
- 하나 팀은 여러 명의 선수를 포함할 수 있다 - 한 명의 선수는 하나의 팀에 꼭 속한다
- 하나의 팀은 하나의 전용 구장을 꼭 가진다 - 하나의 운동장은 하나의 홈팀을 가질 수 있다
- 하나의 운동장은 여러 게임의 스케줄을 가질 수 있다 - 하나의 스케줄은 하나의 운동장에 꼭 배정된다
아래는 앞으로 사용하게 될 부서-사원 테이블 간의 관계를 표현한 ERD이다.
사원-부서 테이블 간의 양방향 관계는 다음과 같다.
- 하나의 부서는 여러 명의 사원을 보유할 수 있다 - 한 명의 사원은 하나의 부서에 꼭 소속된다
'SQLD > SQL 기본 및 활용' 카테고리의 다른 글
3-6 FUNCTION (0) | 2020.02.28 |
---|---|
3-5 WHERE 절 (0) | 2020.02.28 |
3-4 TCL (0) | 2020.02.28 |
3-3 DML (0) | 2020.02.28 |
3-2 DDL (0) | 2020.02.27 |