Varianta na Neilovo řešení, která nepotřebuje rozšíření, je:
create table friendz (
from_id int,
to_id int
);
create unique index ifriendz on friendz(greatest(from_id,to_id), least(from_id,to_id));
Neilovo řešení vám však umožňuje používat libovolný počet sloupců.
Oba se spoléháme na použití výrazů k vytvoření indexu, který je zdokumentován https://www.postgresql.org/docs/current/indexes-expressional.html