Придерживаясь как можно ближе к вашей модели, вы можете разделить таблицу на две части: одну с 1 строкой на «документ» и одну с 1 строкой на «версию»:
У вас есть следующая таблица "версий" -
Column | Type | Modifiers
------------+------------------------+--------------------
id | character varying(32) | not null
version | integer | not null default 1
content | character varying(128) |
Indexes:
"versions_pkey" PRIMARY KEY, btree (id, version)
и следующая таблица "документы" -
Column | Type | Modifiers
------------+------------------------+--------------------
id | character varying(32) | not null
link_id | character varying(32) |
Indexes:
"docs_pkey" PRIMARY KEY, btree (id)
сейчас
my_db=# ALTER TABLE docs ADD FOREIGN KEY(link_id) REFERENCES docs (id) ;
разрешено, и вы также хотите:
my_db=# ALTER TABLE versions ADD FOREIGN KEY(id) REFERENCES docs;
конечно, ничто не мешает вам получить «комбинированный» вид, похожий на исходную таблицу:
CREATE VIEW v_docs AS
SELECT id, version, link_id, content from docs join versions using(id);