DDL이란? #
DDL은 Data Definition Language입니다.
데이터베이스의 구조를 정의, 수정, 삭제하는데 사용되는 명령어 집합입니다.
SQL Command = {DDL, DML, DCL, TCL}
이라고 할 수 있습니다.
이제 DDL이 SQL Command의 일부이며, 데이터베이스의 구조를 정의, 수정, 삭제한다는 것을 알았습니다.
아직 도메인, 스키마, 테이블, 뷰, 인덱스와 DDL의 연결이 부족한 것 같습니다.
하나씩 알아보도록 하겠습니다.
도메인(Domain)이란? #
개발에선 domain이란 이름을 여러곳에서 사용합니다. 함수(정의역)에서도, url(www.google.com)에서도, DB에서도 사용합니다.
DB에서의 도메인은 특정 열(필드)에서 허용되는 값의 범위나 유형의 정의를 의미합니다.
User table을 만든다고 가정하고 User의 id는 integer형으로 하겠습니다. 위처럼 각 열의 데이터 타입과 제약조건을 정의하는 것을 도메인을 설정한다고 합니다.
스키마란(Schema)이란? #
-
구조적 정의:
- 스키마는 데이터베이스 내의 모든 테이블, 뷰, 인덱스, 관계 등을 포함한 구조를 정의합니다.
-
테이블간의 관계:
- ex.1) 뮤지션 테이블과 음원의 관계 (1 : N)
- ex.2) 선생님 테이블과 학급 테이블의 관계 (1 : N)
-
데이터 무결성:
- 형식지정(domain의 설정): 각 열의 데이터 타입을 지정하는 것으로 필드에 부적절 한 값이 들어오지 못하도록 합니다. 이를 통해 일관성과 정확성을 유지합니다.
- 제약 조건 설정:
- NOT NULL이나 UNIQUE, 등의 제약 조건을 설정함으로써 필드를 비워두거나 중복된 값을 막을 수 있습니다. CHECK 제약 조건을 통해 특정 제약조건을 만족하는 데이터만 저장되게 할 수도 있습니다.
- 기본 키, 외래 키:
- 기본 키와 외래 키를 정의 할 수 있습니다. 기본키는 테이블 내의 각 레코드를 고유하게 식별하고, 외래 키는 다른 테이블의 기본 키를 참조해 테이블간의 관계를 정의 할 수 있고 이러한 키들은 참조 무결성을 보장하여 관련된 테이블 간에 일관된 데이터를 유지 할 수 있게 합니다.
- 참조 무결성(Referential Integrity): 데이터의 일관성과 정확성을 보장하는 개념
- 외래 키 관계: 외래 키를 사용해 두 테이블 간의 관계를 정의합니다.
- 주문 테이블의 고객 ID 열은 고객 테이블의 ID(기본 키) 열을 참조할 수 있습니다.
- 외래 키 관계: 외래 키를 사용해 두 테이블 간의 관계를 정의합니다.
-
표준화 및 일관성:
- 스키마는 데이터베이스의 구조와 규칙이 되며, 이는 데이터의 일관성과 예측 가능성을 보장해주는 역할을 합니다.
-
추상화 수준:
- 스키마는 논리 또는 물리적 수준에서 정의 될 수 있습니다. 이를 논리적 / 물리적 스키마라고 합니다.
-
논리적 스키마:
- 데이터베이스의 구조를 추상적인 수준에서 정의합니다. 사용자와 프로그램이 데이터베이스와 어떻게 상호 작용하는지에 초점을 두고 있습니다.
- 물리적 저장방식에 독립적이기 때문에 저장방식이 바뀌어도 영향받지 않음
- 데이터베이스의 논리적 구조를 정의함
- 데이터베이스 내의 엔티티들과 그들 간의 관계를 정의함
- 엔티티의 정의와 속성은 논리적 스키마의 일부이다.
- 데이터베이스의 구조를 추상적인 수준에서 정의합니다. 사용자와 프로그램이 데이터베이스와 어떻게 상호 작용하는지에 초점을 두고 있습니다.
-
물리적 스키마:
- 데이터가 실제로 저장되고 관리되는지를 나타냅니다. 저장의 효율성과 성능에 중점을 둔 스키마입니다.
- 데이터 저장: 데이터가 하드 드라이브, 네트워크 등의 물리적 저장 매체에 어떻게 저장되는지 나타냄
- 인덱싱 및 최적화: 데이터의 접근 방법, 인덱싱 전략, 데이터 분할 방법등을 포함
- 데이터가 실제로 저장되고 관리되는지를 나타냅니다. 저장의 효율성과 성능에 중점을 둔 스키마입니다.
-
- 스키마는 논리 또는 물리적 수준에서 정의 될 수 있습니다. 이를 논리적 / 물리적 스키마라고 합니다.
테이블(table)이란? #
테이블은 데이터를 구조화하고 저장하는 기본 단위입니다. RDB에서 테이블의 주요한 요소는 아래와 같습니다.
- 열(Column)과 행(Row):
- 열은 테이블의 특정 종류의 정보를 나타냅니다. 동일한 타입의 값을 가집니다.
- 행은 개별 데이터 레코드를 나타내며 각 행은 열에 정의된 속성에 따라 구조화된 데이터 집합을 가집니다. (마치 구조체처럼 말이죠)
- 기본 키(Primary Key):
- 각 행을 고유하게 식별하는 열
- 각 행이 고유함을 보장함
- 다른 테이블과 관계를 정의하는데 사용함
- 외래 키(Foreign Key):
- 다른 테이블의 기본 키를 참조하는 열
- 외래 키를 통해 테이블간의 관계를 설정하고 참조 무결성을 유지함 (CASCADE)
- 데이터 무결성:
- NOT NULL이나 UNIQUE등의 제약조건을 사용, 데이터의 정확성과 일관성을 보장합니다.
- 인덱싱(Indexing):
- 인덱스는 특정 열에 대한 빠른 검색을 가능하게 하는 목차를 만드는 것으로 검색과 처리 속도를 향상시킵니다.
- 관계:
- 1:1, 1:N, N:M관계로 데이터의 조직화 및 연결에 사용됩니다.
뷰(View)란? #
뷰는 데이터베이스의 실제 테이블로부터 유도된 가상의 테이블입니다. 뷰는 실제 데이터를 저장하지 않고, 하나 이상의 기존 테이블에 대한 SQL 쿼리의 결과로 구성됩니다.
실제 테이블처럼 사용 가능하나 뷰에 대한 쿼리는 뒤에서 실행되는 기본 테이블에 영향을 미칩니다.
- 장점
- 복잡성 감소:
- 복잡한 쿼리를 단순화합니다.
- 추상화:
- 기본 테이블의 복잡성을 모른채로 데이터에 쉽게 접근 가능합니다.
- 논리적 데이터 독립성:
- 기본 테이블의 구조가 변경되어도 뷰를 통해 일관된 방식으로 데이터에 접근 가능합니다.
- 복잡성 감소:
- 언제 쓰는가
- 복잡한 쿼리 간소화:
- 복잡한 조인, 서브쿼리등이 많은 경우 뷰를 사용하기에 좋습니다.
- 보안:
- 사용자에게 일부 데이터만 보여주고 싶은 경우
- 사용자별 맞춤형 데이터 제공:
- 사용자나 프로그램에 맞춰 다른 형태로 데이터를 제공해야 하는 경우 뷰를 사용 할 수 있습니다.
- 데이터베이스 디자인 및 변경 관리:
- 기본 테이블이구조가 변경되어도 뷰를 사용하면 동일한 접근 방식을 유지 할 수 있습니다.
- 복잡한 쿼리 간소화:
일부 데이터베이스에서 뷰에 대한 수정 (INSERT, UPDATE, DELETE)가 제한적일 수 있습니다.
복잡한 뷰는 기본 테이블에 성능저하를 가져 올 수 있습니다.
예시로 employees 테이블을 보는 view를 생성해보겠습니다.
CREATE VIEW department_view AS
SELECT name, department
FROM employees;
사용은 아래와 같습니다.
SELECT * FROM department_view;
인덱스(Index)란? #
인덱스는 검색 속도를 향상시키기 위해 테이블의 특정 열에 대해 생성하는 목차와 같은 것입니다. 예를 들어 책을 구입하면 맨 앞장에 원하는 정보를 찾을 수 있게 목차가 있습니다. 이는 DB의 인덱스와 같은 역할을 합니다.
binary search를 활용해 원하는 값을 찾기 때문에 매우 빠른 속도로 찾을 수 있습니다.
인덱스는 실제 물리적으로 저장되므로 인덱스만큼 공간을 차지하며 삽입과 삭제, 업데이트와 같은 쓰기 작업에서 성능 저하를 일으킬 수 있습니다.