PostgreSQL emplea el término "clúster de bases de datos" para referirse al conjunto de bases gestionadas por una única instancia, no a varios servidores. Cada base de datos, así como las tablas, índices, vistas y demás objetos, se identifica internamente mediante un OID (identificador de objeto entero sin signo). Los objetos integrados del sistema reciben OID bajos preasignados (1, 4, 5 para template1, template0 y postgres), mientras que los objetos creados por el usuario arrancan en 16384, ya que el rango 1-16383 está reservado.
Toda esta información se almacena en catálogos de sistema, que no son más que tablas consultables como pg_database, pg_class o pg_index. La tabla pg_database es la única compartida entre todas las bases del clúster; el resto se replica por base de datos. Los OID se asignaban automáticamente a cada fila hasta PostgreSQL 8.0; desde la versión 8.1 pasaron a ser una característica opcional y desaparecieron por completo a partir de la 12, de modo que hoy solo subsisten para objetos de catálogo y extensiones como pgvector.
En el plano físico, PostgreSQL concentra todos los datos en el directorio apuntado por la variable de entorno PGDATA (por defecto, /var/lib/postgresql//main o la ruta equivalente de Homebrew en macOS), creado por la utilidad initdb. Dentro de ese directorio, cada base de datos tiene su propio subdirectorio dentro de base/, nombrado con su OID. Las tablas e índices cuyo tamaño no supera 1 GB se guardan en un único archivo identificado por su relfilenode, cuyo valor coincide inicialmente con el OID. El artículo lo demuestra de forma práctica: crea una base de datos shop, define la tabla orders y consulta pg_relation_filepath para localizar sus archivos en disco antes y después de ejecutar VACUUM.
