PK(Primary key)와 FK(Foreign key)
PK(Primary key)와 FK(Foreign key)는 테이블 생성 후 별도의 선언 과정을 통해 생성되는 개념적인 엔터티(Conceptual entity)이다. 여기서 개념적이라는 것은 테이블, 열, 칼럼 등의 오브젝트가 아니라는 의미이다. PK의 주 기능은 테이블의 특정 레코드를 특정하는 것인데 이 목적을 달성하기 위해서 PK로 지정된 칼럼(Column)은 반드시 "Not Null"이고 "Unique"한 특성을 가지고 있어야 한다. 레일즈에서는 관례적으로 id 칼럼(column)을 PK로 사용하는데 만약 원한다면 "Not Null과 Unique"한 특성을 만족시키는 다른 칼럼으로 PK를 대치할 수 있다. FK(Foreign key)는 두 테이블간의 관계를 공고히 형성하기 위해 사용되는 칼럼이다. 이때 FK로 지정하려는 칼럼은 다른 테이블에서 PK 조건을 만족하는 칼럼을 레퍼런스 한다. 가령 Blog테이블에서 id가 PK이고 author_id는 FK이다 라는 말은 blogs 테이블에 author_id 컬럼이 존재해야 하고 이 칼럼의 값은 authors 테이블의 id 칼럼을 참조하고 있어야 한다는 말과 같다. 레일즈에서는 belongs_to에 의해 자동으로 FK로 사용될 칼럼의 이름이 결정된다.
인덱스(Index)
인덱스는 DBMS상의 별개의 오브젝트로서 16자리 Hex의 형태를 가지고 있다. 이 값은 테이블의 특정 레코드 또는 그 레코드가 속한 페이지에 대한 다이렉트 주소를 갖고 있어서 빠른 탐색을 가능하게 하는 기구로 사용된다. 어떤 컬럼이 인덱스 지정이 되어 있다면 그 컬럼에 대해 쿼리는 B-tree 알고리즘을 통해서 해당 레코드가 있는 위치로 빠르게 범위를 좁혀가면서 찾아갈 수 있다. 반면 인덱스 지정이 안된 칼럼에 대해서는 해당 테이블의 모든 레코드에 대해 처음부터 끝까지 순차적 스캔을 한 후에야 결과를 내놓기 때문에 테이블의 크기가 커질수록 성능이 떨어지는 문제가 생기게 된다. 레일즈에서는 PK로 사용되는 id 컬럼에 대해서는 자동적으로 인덱스를 지정한다. FK로 사용되는 컬럼을 포함해서 기타 컬럼에 대해 인덱스 지정을 하려면 마이그레이션(migration) 파일에서 add_index() 메쏘드를 사용해서 별도로 지정을 해야한다. 보통 자주 사용하는 쿼리에 쓰는 칼럼이라면 반드시 인덱스를 지정하는 것이 베스트 프랙티스이다.
Join
두 개 이상의 테이블을 결합해서 레코드를 수집하도록 동작하는 SQL문을 지칭한다. 이를 위해서는 테이블간을 엮어주는 공통 컬럼이 필요한데 보통 위에서 언급한 FK와 PK로 지정한 칼럼이 그 역할을 한다. Join은 다시 Inner Join과 Outer Join으로 구분할 수 있는데 전자는 두 테이블의 FK, PK에 같은 값이 존재하는 레코드만을 수집하고, 후자는 값이 일치하거나 Null 이라도 모든 레코드를 수집 대상으로 한다는 차이점이 있다. Outer join은 다시 어떤 테이븗을 기준으로 삼느냐에 따라 Left Outer Join과 Right Outer Join으로 세분화할 수 있다. [1] 레일즈에서 제공하는 joins() 메쏘드는 기본적으로 Inner Join 방식으로 동작하며, Outer Join을 사용하고 싶으면 추가적인 SQL 문을 작성해서 넘겨야한다.