Non credo che usare char o varchar invece di intero sia una buona idea. È difficile aspettarsi quanto sarà più lento del PK intero, ma questo design sarà più lento - l'impatto sarà più terribile quando ti unirai a tavoli più grandi. Se puoi, usa invece i tipi ENUM.
http://www.postgresql.org/docs/9.2/static /datatype-enum.html
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
CREATE TABLE person (
name text,
current_mood mood
);
INSERT INTO person VALUES ('Moe', 'happy');
SELECT * FROM person WHERE current_mood = 'happy';
name | current_mood
------+--------------
Moe | happy
(1 row)
I tipi varchar e char di PostgreSQL sono molto simili. L'implementazione interna è la stessa:char può essere (è un paradosso) un po' più lento a causa dell'aggiunta di spazi.