Nemyslím si, že použití char nebo varchar místo celého čísla je dobrý nápad. Těžko očekávat, o kolik bude pomalejší než celočíselné PK, ale tento návrh bude pomalejší - dopad bude horší, když se připojíte k větším stolům. Pokud můžete, použijte místo toho typy 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)
Typy varchar a char PostgreSQL jsou velmi podobné. Interní implementace je stejná - znak může být (je paradoxní) trochu pomalejší kvůli přidávání mezerami.