테이블
테이블은 데이터를 행과 열로 담는 단위입니다. 열마다 이름이 붙어 있고, 행은 그 열들을 한 벌씩 채웁니다. 데이터베이스에서 익숙한 이름이지만 그 자리에만 있는 것은 아닙니다.
상세
책상 서랍에 모아 둔 명함 한 뭉치를 떠올리면 됩니다. 명함은 저마다 이름·회사·전화번호를 같은 자리에 담고 있습니다. 뭉치를 섞어 다시 넣든 책상 위에 쭉 늘어놓든 거기 누가 들어 있는지는 달라지지 않습니다.
테이블은 같은 열 구성을 가진 행들을 모아 담는, 이름 붙은 단위입니다. 열은 저마다 이름을 갖고, 그 자리에 어떤 값이 올 수 있는지가 정해져 있습니다. 행은 그 열들을 한 벌 채운 것입니다. 테이블은 행이 놓인 순서에 뜻을 두지 않습니다.
| 부르는 말 | 담는 것 |
|---|---|
| 열 | 이름과 값의 종류가 정해진 세로 칸 |
| 행 | 열들을 한 벌 채운 가로줄 |
| 테이블 | 그 행들을 이름 하나로 묶은 단위 |
핵심은 모든 행이 같은 열 구성을 나눠 쓴다는 것입니다. 어떤 행만 열을 하나 더 갖거나 열 이름이 다른 일은 없습니다. 그래서 열 하나를 지목해 전체를 훑거나, 두 테이블을 같은 열의 값으로 이어 붙이는 일이 성립합니다. 여기서 조인·기본 키·제약 같은 말이 딸려 나옵니다.
테이블은 논리 단위입니다. 무엇을 담는지가 정해질 뿐, 그 내용이 디스크에 어떤 모양으로 적히는지는 테이블이 정하지 않습니다. 같은 테이블을 순차 스캔으로 읽든 인덱스로 찾아 들어가든 담긴 것이 무엇인지는 그대로입니다. 그래서 테이블 자체에는 조회 비용이 붙지 않습니다. 한 행을 찾는 데 무엇이 드는지는 그 아래 깔린 저장 구조와 인덱스가 정합니다.
배경
Codd 는 1970년 논문 「A Relational Model of Data for Large Shared Data Banks」에서 그 시절 정보 시스템의 불편을 이렇게 적습니다. 데이터 기술 테이블이 들어온 것은 데이터 독립성이라는 목표를 향한 큰 진전이지만, 그것으로 바꿀 수 있는 데이터 표현의 성격은 아직 꽤 제한적이라는 것입니다. 응용 프로그램을 논리적으로 망가뜨리지 않으면서 바꿀 수 있는 폭이 좁았다는 뜻입니다. 사용자가 상대하는 데이터 모델도 여전히 표현상의 성질로 어질러져 있고, 특히 낱개 항목이 아니라 데이터 묶음을 나타내는 자리가 그렇습니다. 논문은 아직 걷어내야 할 데이터 종속성 가운데 주된 것으로 셋을 꼽습니다.
| 종속성 | 무엇에 묶여 있나 |
|---|---|
| 순서 종속성 | 데이터가 저장된 순서 |
| 색인 종속성 | 색인이 있는지 없는지 |
| 접근 경로 종속성 | 어느 경로로 찾아 들어가는지 |
필요한 것은 저장 표현과 떨어져 있는 데이터 모델이었습니다. 논문은 relation 이라는 말을 수학에서 쓰는 뜻 그대로 씁니다. 집합 S1, S2, …, Sn 이 주어졌을 때, 첫 원소를 S1 에서 둘째 원소를 S2 에서 가져오는 식으로 만든 n-튜플의 집합이 그 집합들 위의 relation 입니다. Sj 를 R 의 j번째 도메인이라 부르고, 이때 R 의 차수는 n 입니다.
설명을 위해 논문은 relation 을 배열로 그립니다. 그 배열이 갖는 성질로 다섯을 적습니다.
| 무엇이 | 어떤가 |
|---|---|
| 행 하나 | 튜플 하나입니다 |
| 행의 순서 | 상관이 없습니다 |
| 행끼리 | 서로 구별됩니다 |
| 열의 순서 | 의미가 있습니다 |
| 각 열의 뜻 | 대응하는 도메인 이름을 붙여 어느 정도 드러납니다 |
논문은 이 배열 표현이 설명을 위한 것이지 자기가 펼치는 관계형 관점의 본질적인 부분은 아니라고 못 박습니다. 그 그림이 오늘 테이블이라 부르는 모양과 같습니다.
예시
PostgreSQL 의 weather 테이블
PostgreSQL 튜토리얼은 테이블 이름과 모든 열 이름, 그리고 그 타입을 적어서 새 테이블을 만든다고 적습니다.
CREATE TABLE weather (
city varchar(80),
temp_lo int, -- low temperature
temp_hi int, -- high temperature
prcp real, -- precipitation
date date
);
열이 다섯입니다. 열 이름 옆에 붙은 것이 그 칸에 올 값의 종류입니다. varchar(80) 은 길이 80자까지의 임의 문자열을 담는 타입이고, int 는 보통의 정수 타입이고, real 은 단정밀도 부동소수점 수를 담는 타입입니다. 문서는 SQL(Structured Query Language)이 키워드와 식별자의 대소문자를 구분하지 않는다고 적습니다. 큰따옴표로 감싸 대소문자를 보존한 식별자는 예외입니다.
리눅스 커널의 라우팅 테이블
ip-route(8) 은 문서 제목부터 라우팅 테이블 관리입니다. 여기 담기는 것을 행으로 놓고 보면 한 행이 경로 하나인 셈입니다.
man 페이지는 리눅스 2.x 가 경로를 여러 라우팅 테이블에 나눠 담을 수 있다고 적습니다. 각 테이블은 1부터 2^32-1 까지의 번호로 가리키거나 /usr/share/iproute2/rt_tables 의 이름으로 가리킵니다. /etc/iproute2/rt_tables 가 있으면 그쪽이 우선합니다. 기본적으로 모든 보통 경로는 main 테이블(번호 254)에 들어가고, 커널은 경로를 계산할 때 이 테이블만 씁니다. 0·253·254·255 는 내장 용도로 예약돼 있습니다.
문서는 눈에 안 보이지만 더 중요한 테이블이 하나 더 늘 있다고 적습니다. local 테이블(번호 255)입니다. 로컬 주소와 브로드캐스트 주소를 위한 경로가 여기 들어 있고, 커널이 이 테이블을 자동으로 관리해서 관리자는 대개 손대거나 들여다볼 필요가 없다고 적습니다. 여러 라우팅 테이블이 실제로 등장하는 것은 정책 라우팅을 쓸 때입니다.
HTML 의 table 요소
MDN(Mozilla Developer Network)은 <table> HTML(HyperText Markup Language) 요소가 표 데이터를 나타낸다고 적습니다. 데이터를 담은 셀의 행과 열로 이루어진 2차원 표로 제시된 정보라는 뜻입니다.
<table>
<caption>front-end web developer course 2021</caption>
<thead>
<tr>
<th scope="col">person</th>
<th scope="col">most interest in</th>
<th scope="col">age</th>
</tr>
</thead>
<tbody>
<tr><th scope="row">chris</th><td>html tables</td><td>22</td></tr>
<tr><th scope="row">dennis</th><td>web accessibility</td><td>45</td></tr>
<tr><th scope="row">sarah</th><td>javascript frameworks</td><td>29</td></tr>
<tr><th scope="row">karen</th><td>web performance</td><td>36</td></tr>
</tbody>
<tfoot>
<tr><th scope="row" colspan="2">average age</th><td>33</td></tr>
</tfoot>
</table>
<thead> 안의 <th scope="col"> 세 개가 열 제목이고, <tbody> 안의 <tr> 하나가 행 하나입니다. 여기서는 열 구성이 마크업의 태그 구조로 드러납니다.
경계
뷰도 테이블인가. 아닙니다.
PostgreSQL 의 CREATE VIEW 레퍼런스는 이 문이 어떤 질의에 대한 뷰를 정의한다고 적습니다. 그리고 그 뷰는 물리적으로 실체화되지 않는다고 적습니다. 대신 뷰가 질의 안에서 참조될 때마다 그 질의가 다시 실행됩니다.
sequenceDiagram
participant 질의
participant 뷰
participant 테이블
질의->>뷰: 이름을 대고 참조
뷰->>테이블: 정의에 적힌 질의를 다시 실행
테이블-->>뷰: 행
뷰-->>질의: 행
이름을 대면 행과 열이 나온다는 점은 테이블과 같습니다. 갈리는 자리는 담고 있느냐입니다. 테이블은 행을 담고, 뷰는 담지 않고 질의만 갖습니다.
관련 항목
테이블을 이루는 구성 요소
행 · 열 · 셀 · 튜플 · 릴레이션 · 레코드 · 도메인 · 데이터형 · 기본 키 · 외래 키 · 제약 · 참조 무결성 · 널
테이블을 호출·실행하는 명령
CREATE TABLE · SELECT · 조인
테이블에 접근하는 경로
인덱스 · 순차 스캔 · 클러스터드 인덱스
테이블을 정의·구현하는 언어·표준·제품
SQL · PostgreSQL · ISO/IEC 9075
테이블이 속하는 상위 구조
스키마 · 데이터베이스 · 관계형 데이터베이스
테이블이 비롯된 배경
관계형 모델 · 데이터 독립성 · Codd · 데이터 모델링
테이블을 저장·설계하는 기법
테이블과 맞세워지는 대립 개념
테이블과 이름이 겹치는 다른 개념
라우팅 테이블 · 페이지 테이블 · 심볼 테이블 · table 요소
테이블이 나타나는 커널 기술
테이블이 나타나는 웹 마크업 기술
다른 이름: table