사전 테이블
개념

테이블

gabury1

테이블은 데이터를 행과 열로 담는 단위입니다. 열마다 이름이 붙어 있고, 행은 그 열들을 한 벌씩 채웁니다. 데이터베이스에서 익숙한 이름이지만 그 자리에만 있는 것은 아닙니다.

상세

책상 서랍에 모아 둔 명함 한 뭉치를 떠올리면 됩니다. 명함은 저마다 이름·회사·전화번호를 같은 자리에 담고 있습니다. 뭉치를 섞어 다시 넣든 책상 위에 쭉 늘어놓든 거기 누가 들어 있는지는 달라지지 않습니다.

테이블은 같은 열 구성을 가진 행들을 모아 담는, 이름 붙은 단위입니다. 열은 저마다 이름을 갖고, 그 자리에 어떤 값이 올 수 있는지가 정해져 있습니다. 행은 그 열들을 한 벌 채운 것입니다. 테이블은 행이 놓인 순서에 뜻을 두지 않습니다.

부르는 말 담는 것
열 이름과 값의 종류가 정해진 세로 칸
행 열들을 한 벌 채운 가로줄
테이블 그 행들을 이름 하나로 묶은 단위

핵심은 모든 행이 같은 열 구성을 나눠 쓴다는 것입니다. 어떤 행만 열을 하나 더 갖거나 열 이름이 다른 일은 없습니다. 그래서 열 하나를 지목해 전체를 훑거나, 두 테이블을 같은 열의 값으로 이어 붙이는 일이 성립합니다. 여기서 조인·기본 키·제약 같은 말이 딸려 나옵니다.

테이블은 논리 단위입니다. 무엇을 담는지가 정해질 뿐, 그 내용이 디스크에 어떤 모양으로 적히는지는 테이블이 정하지 않습니다. 같은 테이블을 순차 스캔으로 읽든 인덱스로 찾아 들어가든 담긴 것이 무엇인지는 그대로입니다. 그래서 테이블 자체에는 조회 비용이 붙지 않습니다. 한 행을 찾는 데 무엇이 드는지는 그 아래 깔린 저장 구조와 인덱스가 정합니다.

배경

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 튜토리얼은 테이블 이름과 모든 열 이름, 그리고 그 타입을 적어서 새 테이블을 만든다고 적습니다.

SQL
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차원 표로 제시된 정보라는 뜻입니다.

HTML
<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 요소

테이블이 나타나는 커널 기술

리눅스 · 커널 · 라우팅

테이블이 나타나는 웹 마크업 기술

HTML · 태그 · MDN

다른 이름: table