스키마
스키마는 데이터를 담기 전에 미리 정해 두는 틀입니다. 무엇을 정해 두는지가 쓰는 자리마다 다릅니다. 그래서 같은 말을 주고받은 두 사람이 서로 다른 것을 떠올린 채 이야기가 흘러가기도 합니다.
상세
여러 정의가 공유하는 뼈대는 하나입니다. 데이터 자체가 아니라, 데이터가 어디에 놓이고 어떻게 생겨야 하는지를 앞서 정해 둔 것입니다. 갈리는 자리는 정해 둔 그것이 담는 그릇이냐 적어 둔 정의냐입니다.
SQL(Structured Query Language)을 쓰는 관계형 데이터베이스에서 스키마는 그릇입니다. PostgreSQL 문서는 데이터베이스가 이름 붙은 스키마를 하나 이상 담고, 그 스키마가 다시 테이블을 담는다고 적습니다. Oracle 문서도 스키마를 스키마 객체라 불리는 데이터 구조들의 논리적 컨테이너라고 적습니다.
같은 그릇 쪽에서도 계층이 한 칸 어긋납니다. MySQL 문서는 CREATE SCHEMA 가 CREATE DATABASE 의 동의어라고 적습니다. PostgreSQL 에서 스키마는 데이터베이스 안의 한 칸이고, MySQL 에서 스키마는 데이터베이스 자체입니다.
JSON(JavaScript Object Notation)·XML(eXtensible Markup Language)·GraphQL 쪽에서 스키마는 그릇이 아닙니다. 적어 둔 문서 자신입니다. JSON Schema 명세는 JSON Schema 를 JSON 데이터의 구조를 정의하는 JSON 미디어 타입이라고 적습니다. XSD(XML Schema Definition) 명세는 XSD 스키마의 목적이 XML 문서의 한 부류를 정의하고 기술하는 것이라고 적습니다. GraphQL 명세는 서비스의 타입 시스템 능력 전체를 그 서비스의 스키마라 부른다고 적습니다.
어느 뜻이 원래 뜻인지는 이 문서들이 적지 않습니다. 그래서 스키마라는 말만으로는 그릇 이야기인지 정의문 이야기인지가 정해지지 않습니다. 맥락 이름을 먼저 대야 뜻이 섭니다.
맥락별 뜻
| 맥락 | 뜻 | 출처 |
|---|---|---|
| PostgreSQL | 데이터베이스 안에서 테이블 등 이름 붙은 객체를 담는 칸 | PostgreSQL Documentation 5.10 Schemas |
| Oracle | 스키마 객체의 논리적 컨테이너. 사용자 계정 하나가 같은 이름의 스키마 하나를 소유한다 | Oracle AI Database Technical Architecture, Schemas and Schema Objects |
| MySQL | 데이터베이스 자체. CREATE SCHEMA 가 CREATE DATABASE 의 동의어다 | MySQL 8.0 Reference Manual, CREATE DATABASE |
| JSON | JSON 데이터의 구조를 정의하는 JSON 미디어 타입 | JSON Schema draft 2020-12 Core 1. Introduction |
| XML | 스키마 구성요소로 XML 문서의 한 부류를 정의하고 제약하는 정의 | XML Schema Definition Language 1.1 Part 1, 1.2 Purpose |
| GraphQL | 서비스의 타입 시스템 능력 전체. 연산이 시작되는 루트 타입을 정한다 | GraphQL Specification October 2021, 3.3 Schema |
PostgreSQL
데이터베이스 클러스터는 이름 붙은 데이터베이스를 하나 이상 담습니다. 롤을 비롯한 몇몇 객체 종류는 클러스터 전체가 나눠 씁니다. 서버로 들어온 클라이언트 연결은 접속 요청에 적은 데이터베이스 하나의 데이터에만 접근할 수 있습니다.
그 데이터베이스 안에 스키마가 들어갑니다. 스키마는 테이블을 담고, 데이터형·함수·연산자 같은 다른 종류의 이름 붙은 객체도 담습니다. 한 스키마 안에서 같은 종류의 객체 둘은 같은 이름을 가질 수 없습니다. 같은 이름을 서로 다른 스키마에서는 충돌 없이 쓸 수 있습니다. schema1 과 myschema 가 각각 mytable 이라는 테이블을 담을 수 있습니다.
flowchart TD
C["데이터베이스 클러스터"] --> D["데이터베이스"]
D --> S1["스키마 schema1"]
D --> S2["스키마 myschema"]
D --> S3["스키마 pg_catalog"]
S1 --> T1["테이블 mytable"]
S2 --> T2["테이블 mytable"]
담는 칸이라고 해서 갈라 막는 벽은 아닙니다. 문서는 데이터베이스와 달리 스키마는 엄격하게 분리되지 않는다고 적습니다. 권한만 있으면 사용자는 접속한 데이터베이스 안의 어느 스키마의 객체든 접근할 수 있습니다. 문서는 스키마를 운영체제의 디렉토리에 빗댑니다. 다만 스키마는 중첩될 수 없다고 덧붙입니다.
데이터베이스마다 pg_catalog 스키마가 하나 있습니다. 시스템 테이블과 내장 데이터형·함수·연산자가 여기 들어 있습니다. pg_catalog 는 언제나 사실상 검색 경로의 일부입니다.
SQL 표준과 어긋나는 자리도 문서가 적어 둡니다. 표준에는 같은 스키마의 객체를 서로 다른 사용자가 소유한다는 관념이 없습니다. 소유자와 다른 이름의 스키마를 아예 못 만들게 하는 구현도 있습니다. 표준이 정한 기본 스키마 지원만 구현한 데이터베이스에서는 스키마와 사용자가 거의 같은 것이 됩니다. public 스키마라는 개념도 SQL 표준에는 없습니다.
Oracle
Oracle 문서는 스키마를 스키마 객체라 불리는 데이터 구조들의 논리적 컨테이너라고 적습니다. 사용자 계정마다 자기 이름과 같은 이름의 스키마 하나를 소유합니다. 소유 관계가 계층에 붙어 있는 셈입니다.
데이터베이스는 스키마에 담기지 않는 종류의 객체도 저장합니다. 데이터베이스 사용자 계정, 롤, 컨텍스트, 딕셔너리 객체가 그것입니다. 그러니 이 제품에서 스키마는 데이터베이스가 담는 것의 전부가 아닙니다.
MySQL
MySQL 문서는 CREATE SCHEMA 가 CREATE DATABASE 의 동의어라고 적습니다. CREATE DATABASE 는 주어진 이름으로 데이터베이스를 만듭니다. 이 문장을 쓰려면 그 데이터베이스에 대한 CREATE 권한이 필요합니다.
같은 문서가 저장 방식도 적습니다. MySQL 의 데이터베이스는 그 데이터베이스의 테이블에 대응하는 파일들을 담은 디렉토리로 구현됩니다. 갓 만든 데이터베이스에는 테이블이 없으므로 CREATE DATABASE 는 MySQL 데이터 디렉토리 아래에 디렉토리 하나만 만듭니다.
두 문서를 나란히 놓으면 낱말이 어긋나는 자리가 드러납니다. PostgreSQL 은 스키마를 디렉토리에 빗대고, MySQL 은 데이터베이스를 디렉토리로 구현한다고 적습니다.
JSON
JSON Schema 명세는 JSON Schema 를 JSON 데이터의 구조를 정의하는 JSON 미디어 타입이라고 적습니다. 검증, 문서화, 하이퍼링크 이동, 상호작용 제어를 정의하려는 것이라고 적습니다.
여기서 스키마는 무언가를 담는 자리가 아닙니다. 스키마 자신이 JSON 문서입니다. 그리고 스키마가 적용되는 JSON 문서에는 따로 이름이 붙어 있습니다. 인스턴스입니다.
XML
XSD 명세는 XSD 스키마의 목적이 XML 문서의 한 부류를 정의하는 것이라고 적습니다. 그 부류를 기술하는 것도 목적입니다. 스키마 구성요소로 그 문서를 이루는 부분들의 의미와 용법과 관계를 제약합니다. 같은 구성요소가 그것들을 문서화합니다. 그 부분들은 데이터형, 요소와 그 내용, 속성과 그 값입니다.
스키마는 추가 문서 정보도 명시할 수 있습니다. 속성값과 요소값의 정규화나 기본값 지정 같은 것입니다. 스키마 자신을 문서화하는 기능도 있습니다.
GraphQL
GraphQL 명세는 서비스의 타입 시스템 능력 전체를 그 서비스의 스키마라 부른다고 적습니다. 스키마는 그것이 지원하는 타입과 지시자로 정의됩니다. 그리고 연산 종류마다 두는 루트 연산 타입으로도 정의됩니다. 연산 종류는 질의, 변형, 구독입니다. 이 루트 연산 타입이 타입 시스템 안에서 그 연산들이 시작되는 자리를 정합니다.
질의 루트 연산 타입은 반드시 제공되어야 합니다. 그리고 반드시 객체 타입이어야 합니다.
경계
스키마와 인스턴스
검증받는 JSON 문서도 스키마인가. 아닙니다. JSON Schema 명세는 스키마가 적용되는 JSON 문서를 인스턴스라 부른다고 따로 적습니다. 이 데이터 모델에 따라 해석된 JSON 값이 인스턴스입니다.
스키마와 인스턴스가 둘 다 JSON 문서라서 헷갈리는 자리입니다. 가르는 선은 문서의 생김새가 아니라 역할입니다. 구조를 적은 쪽이 스키마이고, 그 구조에 맞춰 읽히는 쪽이 인스턴스입니다.
관련 항목
스키마 계층을 이루는 구성 요소
데이터베이스 · 데이터베이스 클러스터 · 테이블 · 인덱스 · 데이터형 · 함수 · 연산자 · 스키마 객체
스키마 안팎에서 물리 저장을 가리키는 이름
태블스페이스 · 데이터 파일 · 디렉토리
데이터베이스가 담지만 스키마엔 담기지 않는 객체
스키마·데이터베이스를 만드는 명령과 필요 권한
CREATE SCHEMA · CREATE DATABASE · 권한
PostgreSQL이 스키마 둘레에 두는 기본 장치와 표준
pg_catalog · public 스키마 · search_path · SQL 표준
JSON Schema가 정의하려는 목적
검증 · 문서화 · 하이퍼링크 이동 · 상호작용 제어
JSON·XML에서 스키마를 구현하는 언어와 짝 개념
JSON Schema · XSD · 미디어 타입 · 인스턴스
XSD 스키마를 이루는 성분
스키마 구성요소 · 요소 · 속성
GraphQL에서 스키마를 정의하는 요소
타입 시스템 · 지시자 · 객체 타입
GraphQL에서 연산이 시작되는 루트 타입과 그 종류
루트 연산 타입 · 질의 · 변형 · 구독
다른 이름: schema