구조화된 데이터는 하나의 테이블로 표현할 수 있다. 관계형 데이터베이스란 테이블(table)로 이루어져 있으며, 이 테이블은 키(key)와 값(value)의 관계를 나타낸다. 이처럼 데이터의 종속성을 관계(relationship)로 표현하는 것이 관계형 데이터베이스의 특징이다.
행(row) : 관계된 데이터의 묶음. 테이블의 한 행에 저장된 데이터를 레코드(record)라고도 부른다.
열(column) : 각각의 열은 유일한 이름을 가지고 있으며, 자신만의 타입을 가지고 있다. 테이블의 한 열을 필드(field) 또는 속성(attribute)이라고도 부른다.
값(value) : 테이블은 각각의 행과 열에 대응하는 값을 가지고 있다. 열의 타입에 맞는 값이어야 한다.
키(key) : 테이블에 저장된 레코드를 고유하게 구분할 수 있는 값. 각 레코드마다 고유한 값을 가진다다. 기본키(primary key)와 외래키(foreign key) 등이 있다.
테이블 간의 관계는 관계를 맺는 테이블의 수에 따라 다음과 같이 나눌 수 있다.
일대일(one-to-one) 관계
일대다(one-to-many) 관계
다대다(many-to-many) 관계
관계형 데이터베이스에서는 이러한 관계를 나타내기 위해 외래 키(foreign key)라는 것을 사용한다.
각 전화번호가 단 한 명의 유저와 연결되어 있고, 그 반대도 동일하다면, User 테이블과 Phonebook 테이블은 1:1 관계(One-to-one relationship)이다.
한 명의 유저가 여러 전화번호를 가질 수 있으나 여러명의 유저가 하나의 전화번호를 가질 수는 없다. 이런 1:N(일대다) 관계는 관계형 데이터베이스에서 가장 많이 사용한다.
다음과 같이 여행 상품을 관리하는 테이블이 있다고 가정하자. 여러 개의 여행 상품이 있고, 여러 명의 고객이 있다. 고객 한 명은 여러 개의 여행 상품을 구매할 수 있고, 여행 상품 하나는 여러 명의 고객이 구매할 수 있다.
여러 개의 레코드가 다른 테이블의 여러 개의 레코드와 관계가 있는 경우다. N:N(다대다) 관계를 위해 스키마를 디자인할 때에는, Join 테이블을 만들어 관리한다. 1:N(일대다) 관계와 비슷하지만, 양방향에서 다수의 레코드를 가질 수 있다.
customer_package 테이블은 customer_id와 package_id를 묶어주는 역할이다. 이 테이블을 통해 어떤 고객이 몇 개의 여행 상품을 구매했는지 또는, 어떤 여행 상품이 몇 명의 고객을 가지고 있는지 등을 확인할 수 있다. 이렇게 조인 테이블을 생성하더라도, 조인 테이블을 위한 기본키(여기서는 cp_id)는 반드시 있어야 한다.
때로는 테이블 내에서도 관계가 필요하다. 예를 들어 추천인이 누구인지 파악하기 위해 사용할 수 있다.
한 명의 유저(user_id)는 한 명의 추천인(recommend_id)를 가질 수 있다. 그러나 여러 명이 한 명의 유저를 추천인으로 등록할 수도 있다. 이 관계는 1:N(일대다) 관계와 유사하다고 생각할 수 있다. 그러나 일반적으로 일대다 관계는 서로 다른 테이블의 관계를 나타낼 때 표현하는 방법이다.
스키마는 테이블을 디자인하기 위한 청사진이다. 이러한 스키마는 테이블의 각 열에 대한 항목과 타입뿐만 아니라 기본 키와 외래 키도 나타내야 한다.