{"id":72509,"date":"2023-12-14T13:12:59","date_gmt":"2023-12-14T12:12:59","guid":{"rendered":"https:\/\/kinqsta.com\/es\/?p=72509&#038;preview=true&#038;preview_id=72509"},"modified":"2023-12-18T09:29:26","modified_gmt":"2023-12-18T08:29:26","slug":"manual-inicio-de-cto-de-startup-para-trabajar-con-postgres","status":"publish","type":"post","link":"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/","title":{"rendered":"El Manual del CTO de una Startup para Trabajar con Postgres"},"content":{"rendered":"<p>Est\u00e1s empezando un nuevo proyecto \u2014 o empresa \u2014 y has decidido que vas a utilizar Postgres. La parte dif\u00edcil (elegir tu base de datos) ha terminado, y ahora empieza la divertida: asegurarte de que no tendr\u00e1s que volver a pensar en ello hasta dentro de unos a\u00f1os.<\/p>\n<p>Este post repasar\u00e1 algunos consejos menos conocidos para configurar Postgres a largo plazo, desde el agrupamiento de conexiones hasta los principios b\u00e1sicos de seguridad, pasando por las extensiones y los \u00edndices.<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Configurar el Pooling de Conexiones para Postgres con PGBouncer<\/h2>\n<p>Por defecto, Postgres crea un <a href=\"https:\/\/www.postgresql.org\/docs\/current\/connect-estab.html\">proceso independiente para cada conexi\u00f3n de cliente a partir del proceso principal<\/a> del sistema operativo. Con poco volumen de tr\u00e1fico, el tiempo que se tarda en crear y destruir esos procesos &#8211; adem\u00e1s del hecho de que nunca se reutilizan- no importar\u00e1. Puedes establecer un n\u00famero de max_connections <a href=\"https:\/\/www.postgresql.org\/docs\/current\/runtime-config-connection.html\">manualmente<\/a>, pero con el tiempo, a medida que aumentes la escala, es probable que te encuentres con problemas en este punto. Un<strong> <a href=\"https:\/\/stackoverflow.blog\/2020\/10\/14\/improve-database-performance-with-connection-pooling\/\">Pooler de Conexiones<\/a><\/strong> te ayuda esencialmente a \u00abalmacenar en cach\u00e9\u00bb estos procesos y reutilizarlos a medida que los clientes se conectan y desconectan de tu base de datos.<\/p>\n<p>Aunque <em>puedes<\/em> integrar el pooler de conexiones en la l\u00f3gica de tu aplicaci\u00f3n, la mayor\u00eda opta por una herramienta de terceros, que en el caso de Postgres es <strong><a href=\"https:\/\/www.pgbouncer.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">PGBouncer<\/a><\/strong>. Es un pooler de conexiones ligero y de c\u00f3digo abierto que puedes instalar <a href=\"https:\/\/www.pgbouncer.org\/faq.html\" target=\"_blank\" rel=\"noopener noreferrer\">tanto<\/a> en tu servidor de base de datos o en tu servidor de aplicaciones. Puedes elegir entre <a href=\"https:\/\/www.pgbouncer.org\/features.html\">3 niveles de pooling<\/a>:<\/p>\n<ul>\n<li><strong>Pooling de sesiones:<\/strong> se mantiene fiel al modelo de \u00ablas conexiones de los clientes son indefinidas\u00bb y mantiene una conexi\u00f3n abierta durante todo el tiempo que un cliente est\u00e1 conectado.<\/li>\n<li><strong>Pooling de transacciones:<\/strong> las conexiones duran una sola transacci\u00f3n, tras la cual se devuelven al pool.<\/li>\n<li><strong>Pooling de sentencias:<\/strong> las conexiones duran s\u00f3lo una consulta, por lo que si tienes varias como parte de una transacci\u00f3n, no funcionar\u00eda en absoluto.<\/li>\n<\/ul>\n<p>La mayor\u00eda elige pooling de sesiones &#8211; es lo m\u00e1s conservador y lo que menos riesgo entra\u00f1a de que se caigan las conexiones &#8211; pero cada aplicaci\u00f3n es diferente, y tendr\u00e1s que averiguar cu\u00e1l es el modo adecuado para tus limitaciones.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>La mayor\u00eda de los frameworks web lo dejan en manos de herramientas de terceros (consulta <a href=\"https:\/\/groups.google.com\/g\/django-developers\/c\/NwY9CHM4xpU\">este hilo del foro de Django<\/a> sobre PGBouncer), pero Rails proporciona una <a href=\"https:\/\/api.rubyonrails.org\/classes\/ActiveRecord\/ConnectionAdapters\/ConnectionPool.html\">funci\u00f3n nativa<\/a> de pool de conexiones.<\/p>\n<\/aside>\n\n<h3>Impacto del Pool de Conexiones en el Rendimiento<\/h3>\n<p>La pregunta del mill\u00f3n: <strong>\u00bffunciona realmente?<\/strong> <a href=\"https:\/\/www.percona.com\/blog\/scaling-postgresql-with-pgbouncer-you-may-need-a-connection-pooler-sooner-than-you-expect\/\" target=\"_blank\" rel=\"noopener noreferrer\">Percona ejecut\u00f3<\/a> una serie de pruebas comparativas para averiguar c\u00f3mo afecta PGBouncer al rendimiento. Con un n\u00famero reducido de clientes simult\u00e1neos (&lt;60), PGBouncer <em>degrada<\/em> bastante las transacciones por segundo (TPS) debido a la sobrecarga del pooling. Pero cuando aumentas a &gt;100, empiezas a ver ventajas significativas en el rendimiento.<\/p>\n<figure>\n<p><figure style=\"width: 612px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2023\/10\/pgbouncer.png\" alt=\"PGBouncer\" width=\"612\" height=\"371\"><figcaption class=\"wp-caption-text\">PGBouncer<\/figcaption><\/figure><\/figure>\n<p>Entonces, \u00bfnecesitas un pooler de conexiones de inmediato para dar soporte a tus primeros usuarios? Probablemente no. Pero utilizar PGBouncer te ayudar\u00e1 una vez que alcances incluso un tr\u00e1fico bajo\/moderado.<\/p>\n<h2>Seguridad Postgres para Dummies<\/h2>\n<p>Durante las primeras semanas que trabajas en tu proyecto, normalmente son s\u00f3lo uno o dos desarrolladores trabajando en una base de datos vac\u00eda; la seguridad no es lo m\u00e1s importante. Pero cuando lances tu aplicaci\u00f3n al mundo, tendr\u00e1 que serlo. Y con las bases de datos, a veces parece que hay <a href=\"https:\/\/www.postgresql.org\/docs\/7.0\/security.htm\" target=\"_blank\" rel=\"noopener noreferrer\">un mill\u00f3n de formas distintas de bloquear las cosas<\/a>.<\/p>\n<h3>Restringir el Acceso a Nivel de Host o de Usuario<\/h3>\n<p>Empecemos por el acceso. Postgres restringe el acceso de dos formas:<\/p>\n<ol start=\"1\">\n<li>A <strong>nivel de host<\/strong> &#8211; definiendo direcciones IP y dominios con derechos de acceso<\/li>\n<li>A <strong>nivel de usuario<\/strong> &#8211; definiendo los usuarios de la base de datos y sus permisos<\/li>\n<\/ol>\n<p>El <a href=\"https:\/\/www.postgresql.org\/docs\/current\/auth-pg-hba-conf.html\" target=\"_blank\" rel=\"noopener noreferrer\">archivo <strong>pg_hba.conf<\/strong><\/a> del directorio PGDATA es donde se define qui\u00e9n puede conectarse a qu\u00e9 bases de datos. Si no tienes una entrada para un cliente ah\u00ed, no podr\u00e1 acceder a la base de datos. Suponiendo que tu servidor de aplicaciones se est\u00e9 ejecutando en otro lugar, as\u00ed es como puedes permitir que acceda a la base de datos:<\/p>\n<pre><code class=\"language-bash\"># Trust any connection via TCP\/IP from this machine\nhost all 127.0.0.1 255.255.255.255 trust<\/code><\/pre>\n<p>Aparte de simplemente \u00abconfiar en cualquier conexi\u00f3n desde esta m\u00e1quina\u00bb, hay montones de formas diferentes de <a href=\"https:\/\/www.postgresql.org\/docs\/current\/client-authentication.html\">autenticar a tu cliente con el servidor de la base de datos<\/a>, desde la contrase\u00f1a a la identificaci\u00f3n, pasando por los certificados. Y si has renunciado a las grandes comodidades de RDS (o Kinsta) y est\u00e1s ejecutando tu backend en el mismo servidor que tu base de datos, puedes <a href=\"https:\/\/www.postgresql.org\/docs\/current\/runtime-config-connection.html\" target=\"_blank\" rel=\"noopener noreferrer\">conectarte mediante sockets Unix<\/a> en lugar de TCP\/IP.<\/p>\n<h3>Autorizaci\u00f3n y Privilegios<\/h3>\n<p>Una vez que tu cliente est\u00e9 autenticado, tienes que abordar la cuesti\u00f3n de la autorizaci\u00f3n. El est\u00e1ndar SQL define un sistema de privilegios, y cada objeto de Postgres (como una tabla, una fila, etc.) tiene diferentes privilegios relacionados con \u00e9l que pueden asignarse a los usuarios: cosas como <code>SELECT<\/code> y <code>UPDATE<\/code>, pero tambi\u00e9n <code>TRUNCATE<\/code>, <code>REFERENCES<\/code>, <code>TRIGGER<\/code>, etc. Puedes otorgar privilegios a los usuarios con el comando <code><a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-grant.html\" target=\"_blank\" rel=\"noopener noreferrer\">GRANT<\/a><\/code>.<\/p>\n<p>La mejor pr\u00e1ctica es seguir el principio del menor privilegio, de modo que el usuario de la base de datos que crees para tu(s) cliente(s) s\u00f3lo debe <em>poder<\/em> acceder a lo que <em>necesite<\/em> acceder.<\/p>\n<h3>Seguridad a Nivel de Fila<\/h3>\n<p>Lo \u00faltimo que hay que tratar aqu\u00ed es la <strong><a href=\"https:\/\/www.postgresql.org\/docs\/current\/ddl-rowsecurity.html\" target=\"_blank\" rel=\"noopener noreferrer\">seguridad a nivel de fila<\/a><\/strong>. La RLS (row level security, seguridad a nivel de fila) existe desde la perspectiva de la tabla (no del usuario) y restringe a qu\u00e9 filas se puede acceder, actualizar, etc. Por defecto, las tablas no tienen activada la RLS, por lo que tu usuario podr\u00e1 hacer lo que dicten sus pol\u00edticas de acceso. Para habilitar RLS para una tabla, empezar\u00edas con:<\/p>\n<pre><code class=\"language-sql\">ALTER TABLE [table_name] ENABLE ROW LEVEL SECURITY<\/code><\/pre>\n<p>Y luego a\u00f1ade una pol\u00edtica. Supongamos que quieres restringir el acceso de lectura a tu tabla <strong>sable_luz_interna <\/strong>a personas de confianza, que ya est\u00e1n definidas en el grupo de usuarios <strong>jedi<\/strong>, de forma que s\u00f3lo el propietario de un sable l\u00e1ser pueda ver sus detalles internos. As\u00ed es como lo har\u00edas:<\/p>\n<pre><code class=\"language-sql\">ALTER TABLE sable_luz_interna ENABLE ROW LEVEL SECURITY\nCREATE POLICY jedi_only ON sable_luz_interna TO jedi\n    USING (jedi = sable_luz_interna);<\/code><\/pre>\n<p>Las pol\u00edticas de RLS como \u00e9sta son \u00fatiles cuando necesitas seguridad a un nivel m\u00e1s granular que el de las tablas (situaciones con PII, etc.).<\/p>\n<h2>Prep\u00e1rate para los Problemas de Escalado<\/h2>\n<p>En todas las startups en las que he trabajado, ha habido cierto grado de escalado manual en lo que se refiere a la base de datos. Un d\u00eda te despertar\u00e1s, y Datadog se est\u00e1 volviendo loco porque tu servidor Postgres se ha quedado completamente sin espacio. Investigar\u00e1s, actualizar\u00e1s la p\u00e1gina de incidencias y, finalmente, aumentar\u00e1s el tama\u00f1o del disco hasta que vuelva a ocurrir (aunque la pr\u00f3xima vez puede que sea un problema de RAM). \u00a1Adelantarse a estas cosas puede ayudar! Algunas sugerencias:<\/p>\n<h3>1. Configura la Supervisi\u00f3n de la Base de Datos<\/h3>\n<p>La mayor\u00eda de las empresas en las que he trabajado utilizan <a href=\"https:\/\/www.datadoghq.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Datadog<\/a> para la monitorizaci\u00f3n de sus bases de datos. Si utilizas un servicio de base de datos gestionada, probablemente puedas arregl\u00e1rtelas un poco utilizando su material nativo. Datadog tiene un <a href=\"https:\/\/www.datadoghq.com\/blog\/postgresql-monitoring\/\" target=\"_blank\" rel=\"noopener noreferrer\">buen art\u00edculo en su blog<\/a> sobre las principales m\u00e9tricas que debes vigilar, como el rendimiento de lectura y escritura, los escaneos secuenciales, los datos escritos en disco, etc.<\/p>\n<h3>2. Elabora Directrices para Escalar Verticalmente<\/h3>\n<p>Cuando tu equipo reciba un aviso &#8211; y\u00a0 ocurrir\u00e1 &#8211; , lo \u00faltimo que quieres es que todos tengan que ponerse manos a la obra para resolver el problema, cuando en la mayor\u00eda de los casos, una simple ampliaci\u00f3n resuelve el problema. Es bueno elaborar un plan b\u00e1sico para tu equipo sobre lo que est\u00e1 dentro del alcance cuando te est\u00e1s quedando sin espacio o computaci\u00f3n.<\/p>\n<h3>3. Limpieza con Vacuum y Ajuste de tu Autovacuum<\/h3>\n<p>Cuando <code>DELETE<\/code> datos en Postgres o <code>UPDATE<\/code> datos (que es funcionalmente equivalente a borrar e insertar), Postgres <a href=\"https:\/\/www.2ndquadrant.com\/en\/blog\/autovacuum-tuning-basics\/\" target=\"_blank\" rel=\"noopener noreferrer\">no borra realmente esos datos<\/a> de inmediato (\ud83d\ude31). En lugar de eso, se \u00abmarcan\u00bb como borrados almacenando el ID de transacci\u00f3n del borrado en una cabecera <strong>xmax<\/strong>; la raz\u00f3n de esto es que hace que MVCC en Postgres sea m\u00e1s sencillo. Pero si estas filas no se borran <em>realmente<\/em> con el tiempo, empezar\u00e1n a malgastar espacio en disco y te dar\u00e1n problemas.<\/p>\n<p>La forma m\u00e1s sencilla de deshacerte de estas filas es utilizar el comando <code><a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-vacuum.html\" target=\"_blank\" rel=\"noopener noreferrer\">VACUUM<\/a><\/code>. Podr\u00edas ejecutar un vacuum manualmente cada vez que se acumulen filas muertas o incluso configurarlo para que se ejecute cada x minutos, pero una estrategia mejor es hacer un autovacuum en funci\u00f3n de cu\u00e1ntas filas muertas se hayan acumulado. Ajustar tu autovacuum es un tema lleno de matices que va m\u00e1s all\u00e1 del alcance de este post: Te recomiendo encarecidamente que leas el <a href=\"https:\/\/www.2ndquadrant.com\/en\/blog\/autovacuum-tuning-basics\/\" target=\"_blank\" rel=\"noopener noreferrer\">art\u00edculo<\/a> de 2ndQuadrant al respecto.<\/p>\n<h3>4. Configura una R\u00e9plica de Lectura (o Dos)<\/h3>\n<p>Esto es f\u00e1cil. Si prev\u00e9s un aumento significativo del tr\u00e1fico (un lanzamiento pr\u00f3ximo, etc.), puedes crear f\u00e1cilmente r\u00e9plicas de s\u00f3lo lectura (o al menos una); te ayudar\u00e1n a descargar algo de trabajo de la instancia principal de la BD.<\/p>\n<p>Si optas por varias r\u00e9plicas, obtendr\u00e1s la ventaja a\u00f1adida de mejorar la disponibilidad si alguna de ellas se cae por cualquier motivo. A\u00f1adir r\u00e9plicas es bastante sencillo en la mayor\u00eda de los proveedores de DBaaS; s\u00f3lo tienes que estar atento al coste: a menudo tienen el mismo precio que una instancia de BD principal a pesar de ser de s\u00f3lo lectura.<\/p>\n<h2>A\u00f1ade \u00cdndices a tus Tablas M\u00e1s Grandes (Previstas)<\/h2>\n<p>Los \u00edndices de base de datos ayudan a acelerar las consultas de lectura creando estructuras de datos auxiliares que hacen m\u00e1s r\u00e1pidos tus escaneos. Para muchos casos de uso, a\u00f1adir un \u00edndice a una tabla o dos es b\u00e1sicamente una obviedad. En Postgres, puedes crear un \u00edndice con el comando <code><a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-createindex.html\" target=\"_blank\" rel=\"noopener noreferrer\">CREATE INDEX<\/a><\/code> (duh). Cuando consultes una tabla, la base de datos comprobar\u00e1 si existe un \u00edndice, y lo utilizar\u00e1 en caso afirmativo ((por cierto, puedes comprobarlo con <code><a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-explain.html\" target=\"_blank\" rel=\"noopener noreferrer\">EXPLAIN<\/a><\/code>).<\/p>\n<p>El tipo de \u00edndice m\u00e1s popular en Postgres &#8211; y el predeterminado cuando se utiliza <code>CREATE INDEX<\/code> &#8211; es el<strong> \u00cdndice<\/strong> <strong>B-Tree<\/strong>. Esencialmente, toma la columna sobre la que quieres crear un \u00edndice, la ordena y almacena punteros a las filas ordenadas. De este modo, puedes obtener la eficiencia de la b\u00fasqueda binaria en cualquier columna que desees, no s\u00f3lo en la columna en la que est\u00e1 ordenada la tabla real (si es que existe). Puedes leer m\u00e1s detalladamente c\u00f3mo se implementan estos \u00e1rboles en la documentaci\u00f3n de Postgres <a href=\"https:\/\/www.postgresql.org\/docs\/current\/btree-implementation.html\" target=\"_blank\" rel=\"noopener noreferrer\">aqu\u00ed<\/a>.<\/p>\n<p>Aunque son \u00fatiles, los \u00edndices no son todo diversi\u00f3n y juegos; ocupan espacio, y si no tienes cuidado con cu\u00e1ntos y de qu\u00e9 tipo creas, pueden empezar a degradar el rendimiento de la base de datos. Nadie lo dice mejor que la propia <a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-createindex.html\">documentaci\u00f3n de Postgres<\/a>:<\/p>\n<p><em>\u00abLos \u00edndices se utilizan principalmente para mejorar el rendimiento de la base de datos (aunque un uso inadecuado puede provocar un rendimiento m\u00e1s lento)\u00bb<br \/>\n<\/em><br \/>\nInternamente, cuando creas un \u00edndice, Postgres materializa una tabla de consulta que tiene el \u00edndice y un puntero al registro del \u00edndice. Demasiadas de esas tablas consumen espacio en disco, hacen que las consultas INSERT tarden m\u00e1s y obligan al motor de consultas a considerar m\u00e1s opciones antes de elegir c\u00f3mo ejecutar una consulta.<\/p>\n<h2>Bonus: A\u00f1ade Algunas Extensiones Postgres<\/h2>\n<p>Algo que hace \u00fanico a Postgres es la <a href=\"https:\/\/www.postgresql.org\/docs\/15\/external-extensions.html\" target=\"_blank\" rel=\"noopener noreferrer\">compatibilidad nativa<\/a> con extensiones de terceros. Puedes crearlas a partir de SQL y C, y pueden ser tan peque\u00f1as como un par de sentencias o tan grandes como toda una biblioteca de software. Utilizar <a href=\"https:\/\/gist.github.com\/joelonsql\/e5aa27f8cc9bd22b8999b7de8aee9d47#file-postgresql-extensions-md\">extensiones disponibles p\u00fablicamente \/ de c\u00f3digo abierto<\/a> te ayuda del mismo modo que utilizar un paquete de software; \u00bfpor qu\u00e9 escribir tu propio c\u00f3digo cuando puedes utilizar el de otro? Aqu\u00ed tienes algunas de las extensiones Postgres m\u00e1s populares:<\/p>\n<h3>Timescale<\/h3>\n<p><a href=\"https:\/\/www.timescale.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Timescale<\/a> es una extensi\u00f3n de Postgres para trabajar con datos de series temporales. En pocas palabras, hace que tus consultas sean (mucho) m\u00e1s r\u00e1pidas y almacena los datos de series temporales de forma muy eficiente. Puedes encontrar las instrucciones de instalaci\u00f3n <a href=\"https:\/\/docs.timescale.com\/self-hosted\/latest\/install\/\" target=\"_blank\" rel=\"noopener noreferrer\">aqu\u00ed<\/a>, o considerar la opci\u00f3n de Timescale alojada en la nube si realmente diriges tu negocio con datos de series temporales (aunque probablemente ya seas consciente de ello si lo eres).<\/p>\n<h3>PostGIS<\/h3>\n<p><a href=\"https:\/\/postgis.net\/\" target=\"_blank\" rel=\"noopener noreferrer\">PostGIS<\/a> a\u00f1ade soporte a Postgres para almacenar, indexar y consultar datos geogr\u00e1ficos (piensa en l\u00edneas, pol\u00edgonos, ubicaciones, etc.). Si utilizas un proveedor en la nube, la mayor\u00eda preinstalan PostGIS. Pero si necesitas instalarlo t\u00fa mismo, puedes encontrar instrucciones de instalaci\u00f3n <a href=\"https:\/\/postgis.net\/documentation\/getting_started\/\" target=\"_blank\" rel=\"noopener noreferrer\">aqu\u00ed<\/a>.<\/p>\n<h3>pg_stat_staements<\/h3>\n<p><a href=\"https:\/\/www.postgresql.org\/docs\/current\/pgstatstatements.html\" target=\"_blank\" rel=\"noopener noreferrer\">pg_stat_statements<\/a> crea una vista en tu base de datos Postgres con estad\u00edsticas sobre cada consulta ejecutada en la base de datos. Puedes ver estad\u00edsticas como cu\u00e1nto tiempo tarda en ejecutarse la consulta (media, mediana, promedio, etc.), qui\u00e9n ejecuta la consulta, accesos a la cach\u00e9 de bloques, n\u00famero de bloques escritos, y muchas m\u00e1s (44 columnas en total en esa vista). <a href=\"https:\/\/gist.github.com\/rcanepa\/535163dc249539912c25\" target=\"_blank\" rel=\"noopener noreferrer\">Para instalarlo<\/a>, s\u00f3lo tienes que a\u00f1adirlo a tu archivo .conf y reiniciar el servidor.<\/p>\n<h3>pg_audit<\/h3>\n<p><a href=\"https:\/\/www.pgaudit.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">pg_audit<\/a> ayuda a las empresas que pueden estar sujetas a auditor\u00edas detalladas (por ejemplo, gubernamentales, financieras, etc.). Puedes hacer que Postgres registre todas y cada una de las sentencias contra la base de datos configurando `log_statement=all`, pero eso no significa que la informaci\u00f3n que necesitas vaya a ser f\u00e1cil de buscar y encontrar. pg_audit utiliza las funciones de registro internas de Postgres para que sea m\u00e1s f\u00e1cil encontrar y trabajar con esos registros que un auditor podr\u00eda necesitar. Puedes encontrar las instrucciones de instalaci\u00f3n <a href=\"https:\/\/github.com\/pgaudit\/pgaudit\" target=\"_blank\" rel=\"noopener noreferrer\">aqu\u00ed<\/a>.<\/p>\n<h2>Resumen<\/h2>\n<p>Postgres es una opci\u00f3n estupenda (y <a href=\"https:\/\/clearbit.com\/resources\/books\/data-driven-marketing\/b2b-seo-content-that-ranks\" target=\"_blank\" rel=\"noopener noreferrer\">muy popular<\/a>) sobre la que construir tu empresa y que estamos orgullosos de soportar en Kinsta. Esperamos que estos consejos te ayuden a ponerte en marcha y a prepararte para escalar. \u00bfOtros consejos o reflexiones sobre tu experiencia? H\u00e1znoslo saber aqu\u00ed.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Est\u00e1s empezando un nuevo proyecto \u2014 o empresa \u2014 y has decidido que vas a utilizar Postgres. La parte dif\u00edcil (elegir tu base de datos) ha &#8230;<\/p>\n","protected":false},"author":310,"featured_media":72510,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[1319],"class_list":["post-72509","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-postgresql"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>El Manual del CTO de una Startup para Trabajar con Postgres - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Conoce algunos consejos menos conocidos para configurar Postgres a largo plazo, desde el pool de conexiones hasta los principios b\u00e1sicos de seguridad, pasando por las extensiones y los \u00edndices.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"El Manual del CTO de una Startup para Trabajar con Postgres\" \/>\n<meta property=\"og:description\" content=\"Conoce algunos consejos menos conocidos para configurar Postgres a largo plazo, desde el pool de conexiones hasta los principios b\u00e1sicos de seguridad, pasando por las extensiones y los \u00edndices.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinsta.es\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-12-14T12:12:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-12-18T08:29:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Justin Gage\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Conoce algunos consejos menos conocidos para configurar Postgres a largo plazo, desde el pool de conexiones hasta los principios b\u00e1sicos de seguridad, pasando por las extensiones y los \u00edndices.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_ES\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_ES\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Justin Gage\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/\"},\"author\":{\"name\":\"Justin Gage\",\"@id\":\"https:\/\/kinqsta.com\/es\/#\/schema\/person\/9c79ef0f55180723ff2b31baffe9070f\"},\"headline\":\"El Manual del CTO de una Startup para Trabajar con Postgres\",\"datePublished\":\"2023-12-14T12:12:59+00:00\",\"dateModified\":\"2023-12-18T08:29:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/\"},\"wordCount\":2403,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\",\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/\",\"url\":\"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/\",\"name\":\"El Manual del CTO de una Startup para Trabajar con Postgres - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\",\"datePublished\":\"2023-12-14T12:12:59+00:00\",\"dateModified\":\"2023-12-18T08:29:26+00:00\",\"description\":\"Conoce algunos consejos menos conocidos para configurar Postgres a largo plazo, desde el pool de conexiones hasta los principios b\u00e1sicos de seguridad, pasando por las extensiones y los \u00edndices.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/#primaryimage\",\"url\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\",\"contentUrl\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinqsta.com\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL\",\"item\":\"https:\/\/kinqsta.com\/es\/secciones\/postgresql\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"El Manual del CTO de una Startup para Trabajar con Postgres\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinqsta.com\/es\/#website\",\"url\":\"https:\/\/kinqsta.com\/es\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluciones de alojamiento premium, r\u00e1pidas y seguras\",\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinqsta.com\/es\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinqsta.com\/es\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinqsta.com\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinqsta.com\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinsta.es\/\",\"https:\/\/x.com\/Kinsta_ES\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinqsta.com\/es\/#\/schema\/person\/9c79ef0f55180723ff2b31baffe9070f\",\"name\":\"Justin Gage\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinqsta.com\/es\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/204874e8a52203e297ea240336c356ba?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/204874e8a52203e297ea240336c356ba?s=96&d=mm&r=g\",\"caption\":\"Justin Gage\"},\"description\":\"Justin is a technical writer and author of the popular Technically newsletter. He did his B.S. in Data Science before a stint in full-stack engineering and now focuses on making complex technical concepts accessible to everyone.\",\"sameAs\":[\"https:\/\/technically.substack.com\/\"],\"url\":\"https:\/\/kinqsta.com\/es\/blog\/author\/justingage\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"El Manual del CTO de una Startup para Trabajar con Postgres - Kinsta\u00ae","description":"Conoce algunos consejos menos conocidos para configurar Postgres a largo plazo, desde el pool de conexiones hasta los principios b\u00e1sicos de seguridad, pasando por las extensiones y los \u00edndices.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/","og_locale":"es_ES","og_type":"article","og_title":"El Manual del CTO de una Startup para Trabajar con Postgres","og_description":"Conoce algunos consejos menos conocidos para configurar Postgres a largo plazo, desde el pool de conexiones hasta los principios b\u00e1sicos de seguridad, pasando por las extensiones y los \u00edndices.","og_url":"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinsta.es\/","article_published_time":"2023-12-14T12:12:59+00:00","article_modified_time":"2023-12-18T08:29:26+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","type":"image\/jpeg"}],"author":"Justin Gage","twitter_card":"summary_large_image","twitter_description":"Conoce algunos consejos menos conocidos para configurar Postgres a largo plazo, desde el pool de conexiones hasta los principios b\u00e1sicos de seguridad, pasando por las extensiones y los \u00edndices.","twitter_image":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","twitter_creator":"@Kinsta_ES","twitter_site":"@Kinsta_ES","twitter_misc":{"Escrito por":"Justin Gage","Tiempo de lectura":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/#article","isPartOf":{"@id":"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/"},"author":{"name":"Justin Gage","@id":"https:\/\/kinqsta.com\/es\/#\/schema\/person\/9c79ef0f55180723ff2b31baffe9070f"},"headline":"El Manual del CTO de una Startup para Trabajar con Postgres","datePublished":"2023-12-14T12:12:59+00:00","dateModified":"2023-12-18T08:29:26+00:00","mainEntityOfPage":{"@id":"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/"},"wordCount":2403,"commentCount":0,"publisher":{"@id":"https:\/\/kinqsta.com\/es\/#organization"},"image":{"@id":"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/","url":"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/","name":"El Manual del CTO de una Startup para Trabajar con Postgres - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinqsta.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/#primaryimage"},"image":{"@id":"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","datePublished":"2023-12-14T12:12:59+00:00","dateModified":"2023-12-18T08:29:26+00:00","description":"Conoce algunos consejos menos conocidos para configurar Postgres a largo plazo, desde el pool de conexiones hasta los principios b\u00e1sicos de seguridad, pasando por las extensiones y los \u00edndices.","breadcrumb":{"@id":"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/#primaryimage","url":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","contentUrl":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinqsta.com\/es\/blog\/manual-inicio-de-cto-de-startup-para-trabajar-con-postgres\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinqsta.com\/es\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL","item":"https:\/\/kinqsta.com\/es\/secciones\/postgresql\/"},{"@type":"ListItem","position":3,"name":"El Manual del CTO de una Startup para Trabajar con Postgres"}]},{"@type":"WebSite","@id":"https:\/\/kinqsta.com\/es\/#website","url":"https:\/\/kinqsta.com\/es\/","name":"Kinsta\u00ae","description":"Soluciones de alojamiento premium, r\u00e1pidas y seguras","publisher":{"@id":"https:\/\/kinqsta.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinqsta.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/kinqsta.com\/es\/#organization","name":"Kinsta","url":"https:\/\/kinqsta.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinqsta.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinqsta.com\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinsta.es\/","https:\/\/x.com\/Kinsta_ES","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinqsta.com\/es\/#\/schema\/person\/9c79ef0f55180723ff2b31baffe9070f","name":"Justin Gage","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinqsta.com\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/204874e8a52203e297ea240336c356ba?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/204874e8a52203e297ea240336c356ba?s=96&d=mm&r=g","caption":"Justin Gage"},"description":"Justin is a technical writer and author of the popular Technically newsletter. He did his B.S. in Data Science before a stint in full-stack engineering and now focuses on making complex technical concepts accessible to everyone.","sameAs":["https:\/\/technically.substack.com\/"],"url":"https:\/\/kinqsta.com\/es\/blog\/author\/justingage\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/posts\/72509","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/users\/310"}],"replies":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/comments?post=72509"}],"version-history":[{"count":9,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/posts\/72509\/revisions"}],"predecessor-version":[{"id":72553,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/posts\/72509\/revisions\/72553"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/72509\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/72509\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/72509\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/72509\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/72509\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/72509\/translations\/jp"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/72509\/translations\/es"},{"href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/72509\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/media\/72510"}],"wp:attachment":[{"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/media?parent=72509"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/tags?post=72509"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/topic?post=72509"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}