관계형 데이터베이스 개요

2023. 3. 8. 20:43SQL/SQL 전문가 가이드(2020 개정판)

1. 데이터베이스

DBMS(Database Management System): 많은 사용자들은 더 효율적인 데이터 관리뿐 아니라 예기치 못한 사건으로 인한 데이터 손상을 피하고, 필요한 데이터를 복구하기 위한 강력한 기능의 소프트웨어를 필요로 하게 되었는데, 이 기본적인 요구사항을 만족시켜주는 시스템을 일컫습니다.

 

■ 데이터베이스의 발전

- 1960년대: 플로우차트 중심의 개발 방법을 사용했으며, 파일 구조로 데이터를 저장·관리했습니다.

- 1970년대: 데이터베이스 관리 기법이 태동했던 시기였으며, 계층형(Hierarchical) 데이터베이스, 망형(Network) 데이터베이스 같은 제품들이 상용화가 되었습니다.

- 1980년대: 현재 대부분의 기업에서 사용되는 관계형 데이터베이스가 상용화되었습니다. (ex. Oracle, Sybase, DB2)

- 1990년대: Oracle, Sybase, Informix, DB2, Teradata, SQL Server 외 많은 제품이 더 향상된 기능으로 정보시스템의 핵심 솔루션으로 자리잡았습니다. 

 

■ 관계형 데이터베이스

파일 시스템은 분산된 데이터 간 정합성을 유지하는 데 과다한 노력이 필요하고, 데이터의 정합성을 보장하기 힘들게 됩니다. 이러한 문제에 대해 관계형 데이터베이스는 정규화를 통한 합리적인 테이블 모델링을 통해 이상(ANOMALY) 현상을 제거하고, 데이터 중복을 피할 수 있으며, 동시성 관리와 병행 제어를 통해 많은 사용자가 동시에 데이터를 공유 및 조작할 수 있는 기능을 제공하고 있습니다. DBMS는 인증된 사용자만 참조할 수 있도록 보안 기능을 제공합니다. 테이블 생성 시에 사용할 수 있는 다양한 제약조건을 이용해 사용자가 실수로 조건에 위배되는 데이터를 입력한다든지, 관계를 연결하는 중요 데이터 삭제를 방지해 데이터 무결성(Integrity)을 보장할 수 있습니다.

 

2. SQL

SQL(Structured Query Language)은 관계형 데이터베이스에서 데이터 정의, 데이터 조작, 데이터를 제어하기위해 사용하는 언어입니다. SQL이 시스템에 미치는 영향이 크기에 고급 SQL이나 SQL 튜닝의 중요성은 계속 올라가고 있으며, SQL 교육은 정확한 데이터를 출력하는 것이 목표이고, SQL 튜닝의 목적은 시스템에 큰 영향을 주는 SQL을 가장 효과적(응답시간, 자원 활용 최소화)으로 작성하는 것이 목표입니다. SQL 문장은 단순 스크립트가 아니라 이름에도 포함돼 있듯이, 일반적인 개발언어처럼 독립된 하나의 개발언어입니다. 특정 데이터들의 집합에서 필요로 하는 데이터를 꺼내서 조회하고, 새로운 데이터를 입력·수정·삭제하는 행위를 통해 사용자는 데이터베이스와 대화하게 됩니다.

SQL 문장과 관련된 용어 중에서 먼저 테이블에 대한 내용은 건드리지 않고, 단순히 조회하는 SELECT 문장이 있습니다. 그리고 INSERT, UPDATE, DELETE 문장은 테이블에 들어 있는 데이터들은 조작하는 SQL 문장들입니다. 그 외 테이블을 생성하고, 수정·변경·삭제하는 테이블 관련 SQL 문장이 있고, 추가로 데이터에 대한 권한을 제어하는 SQL 문장도 있습니다.

SQL 명령어는 3가지 SAVEPOINT 그룹인 DDL, DML, DCL로 나눌 수 있습니다. TCL의 경우 굳이 나눈다면 일부에서 DCL로 분류하기도 하지만, 다소 성격이 다르므로 별도의 4번째 그룹으로 분리할 것을 권고합니다.

 

3. STANDARD SQL 개요

가. 일반 집합 연산자

 

1. UNION 연산은 UNION 기능으로,

2. INTERSECTION 연산은 INTERSECT 기능으로,

3. DIFFERENCE 연산은 EXCEPT(Oracle은 MINUS) 기능으로,

4. PRODUCT 연산은 CROSS JOIN 기능으로 구현됐다.

 

나. 순수 관계 연산자

5. SELECT 연산은 WHERE 절로 구현됐다.

6. PROJECT 연산은 SELECT 절로 구현됐다.

7. (NATURAL) JOIN 연산은 다양한 JOIN 기능으로 구현됐다.

8. DIVIDE 연산은 현재 사용되지 않는다.

4. 테이블

 

한두 명의 선수에 대한 정보는 쉽게 볼 수 있지만, 많은 선수들의 정보를 비교하기 어렵기에 엑셀처럼 데이터 순서를 정해서 비교하는 것이 바람직합니다.

데이터는 관계형 데이터베이스의 기본 단위인 테이블(TABLE) 형태로 저장됩니다. 케이리그 선수들의 정보들을 하나의 표에서 정리할 수 있다면, 이 표만으로 내가 좋아하는 선수들의 상세한 정보를 볼 수 있고, 선수들의 정보를 상호 간 비교해 볼 수도 있습니다.

내용을 보면 선수, 팀, 팀연고지, 포지션, 등번호, 생년월일, 키, 몸무게가 각각의 칼럼이 되고, 해당 테이블은 반드시 하나 이상의 칼럼을 가져야 합니다.

테이블(TABLE)은 데이터를 저장하는 객체(Object)로서 관계형 데이터베이스의 기본 단위입니다. 관계형 데이터베이스에서는 모든 데이터를 칼럼과 행이라는 2차원 구조로 나타냅니다. 세로 방향을 칼럼(Column), 가로 방향을 행(Row)이라고 합니다. 칼럼과 행이 겹치는 하나의 공간을 필드(Field)라고 합니다.

선수와 관련된 데이터를 저장할 때 모든 데이터를 하나의 테이블로 저장하지 않습니다. 분할된 테이블은 그 칼럼의 값에 의해 연결되며 이렇게 테이블을 분할해 데이터의 불필요한 중복을 줄이는 것을 정규화(Normalization)라고 합니다. 데이터의 정합성 확보와 데이터 입력·수정·삭제 시 발생할 수 있는 이상현상(Anomaly)을 방지하기 위해 정규화는 관계형 데이터베이스 모델링에서 매우 중요한 프로세스입니다.

각 행을 한 가지 의미로 특정할 수 있는 한 개 이상의 칼럼을 기본키(Primary Key)라고 합니다. 여기서 <선수> 테이블의 '선수번호'와 <팀> 테이블의 '팀코드'가 기본키가 됩니다. 또 <선수> 테이블의 '팀코드'와 같이 다른 테이블의 기본키로 사용되면서 테이블과의 관계를 연결하는 역할을 하는 칼럼을 외부키(Foreign Key)라고 합니다.

5. ERD

팀 정보와 선수 정보 간에는 어떤 의미의 관계가 존재하며, 다른 테이블과도 어떤 의미의 연관성이나 관계를 갖고 있습니다. ERD(Entity Relationship Diagram)는 이와 같은 관계의 의미를 직관적으로 표현할 수 있는 좋은 수단입니다.

케이리그의 테이블 관계를 IE(Information Engineering) 표기법과 Barker(Case*Method) 표기법으로 표현한 ERD입니다.

케이리그 테이블 간의 양방향 관계는 다음과 같습니다.

 

- 하나의 팀은 여러 명의 선수를 포함할 수 있습니다.

- 한 명의 선수는 하나의 팀에 꼭 속합니다.

- 하나의 팀은 하나의 전용 구장을 꼭 가집니다.

- 하나의 운동장은 하나의 홈팀을 가질 수 있습니다.

- 하나의 운동장은 여러 게임의 스케쥴을 가질 수 있습니다.

- 하나의 스케줄은 하나의 운동장에 꼭 배정됩니다.

앞으로 사용하게 될 부서-사원 테이블 간의 관계를 IE 표기법과 Barker 표기법으로 표현한 ERD입니다.

사원-부서 테이블 간의 양방향 관계는 다음과 같습니다.

 

- 하나의 부서는 여러 명의 사원을 보유할 수 있습니다.

- 한 명의 사원은 하나의 부서에 꼭 소속됩니다.

6. 데이터 유형

데이터 유형은 데이터베이스의 테이블에 특정 자료를 입력할 때, 그 자료를 받아들일 공간을 자료의 유형별로 나누는 기준입니다. 특정 칼럼을 정의할 때, 선언한 데이터 유형은 그 칼럼이 받아들일 수 있는 자료의 유형을 규정합니다. 또한 데이터 유형과 더불어 지정한 크기(Size)도 중요한 역할을 하는데, 선언 당시에 지정한 데이터의 크기를 넘어선 자료가 입력되면 에러를 발생시킬 수 있기 때문입니다.

문자열 유형의 경우, CHAR 유형과 VARCHAR 유형 중 어느 유형을 지정하는지에 대한 문제가 자주 논의됩니다. VARCHAR 유형은 가변 길이이므로 필요한 영역은 실제 데이터 크기뿐이며, 그렇기에 길이가 다양한 칼럼과 정의된 길이와 실제 데이터 길이에 차이가 있는 칼럼에 적합합니다. CHAR에서는 문자열을 비교할 때, 공백(Blank)을 채워서 비교하는 방법을 사용합니다. VARCHAR 유형에서는 맨 처음부터 한 문자씩 비교하고, 공백도 하나의 문자로 취급하므로 끝의 공백이 다르면 다른 문자로 판단합니다.

예)CHAR 유형
  'AA' = 'AA	'
예) VARCHAR 유형
   'AA ≠ 'AA	'

VARCHAR 유형에 대해 예를 들어 알아보면 주민등록번호나 사번처럼 자료들이 고정된 길이의 문자열을 갖지 않는다면 데이터 유형은 VARCHAR 유형을 적용하는 것이 바람직합니다.  CHAR가 아닌 VARCHAR, NUMERIC 유형에서 정의한 길이나 자릿수의 의미는 해당 데이터 유형이 가질 수 있는 최대한의 한계값을 정의한 것이라고 봐야 합니다.