{"id":75539,"date":"2023-12-14T13:13:47","date_gmt":"2023-12-14T12:13:47","guid":{"rendered":"https:\/\/kinqsta.com\/it\/?p=75539&#038;preview=true&#038;preview_id=75539"},"modified":"2023-12-15T12:40:41","modified_gmt":"2023-12-15T11:40:41","slug":"manuale-cto-startup-per-lavorare-con-postgres","status":"publish","type":"post","link":"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/","title":{"rendered":"Il manuale del CTO di una startup per lavorare con Postgres"},"content":{"rendered":"<p>State per iniziare un nuovo progetto &#8211; o per avviare una nuova azienda &#8211; e avete deciso di affidarvi a Postgres. La parte difficile (la scelta del database) \u00e8 andata, e adesso inizia la parte divertente: assicurarsi di non doverci pensare pi\u00f9 per qualche anno.<\/p>\n<p>In questo post troverete alcuni consigli meno noti per configurare Postgres a lungo termine, dal pooling delle connessioni alle basi della sicurezza, fino alle estensioni e agli indici.<\/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>Configurare il pooling delle connessioni per Postgres con PGBouncer<\/h2>\n<p>Per impostazione predefinita, Postgres esegue il fork di un <a href=\"https:\/\/www.postgresql.org\/docs\/current\/connect-estab.html\" target=\"_blank\" rel=\"noopener noreferrer\">processo separato per ogni connessione client<\/a> dal processo principale del sistema operativo. A bassi volumi, il tempo necessario per creare e distruggere questi processi, oltre al fatto che non vengono mai riutilizzati, non \u00e8 importante. Potete impostare <a href=\"https:\/\/www.postgresql.org\/docs\/current\/runtime-config-connection.html\" target=\"_blank\" rel=\"noopener noreferrer\">manualmente<\/a> un numero di max_connections, ma alla fine, con lo scaling, \u00e8 probabile che si verifichino dei problemi. <strong><a href=\"https:\/\/stackoverflow.blog\/2020\/10\/14\/improve-database-performance-with-connection-pooling\/\" target=\"_blank\" rel=\"noopener noreferrer\">Il pooling delle connessioni<\/a><\/strong> aiuta essenzialmente a &#8220;mettere in cache&#8221; questi processi e a <strong>riutilizzarli<\/strong> quando i client si connettono e si disconnettono dal database.<\/p>\n<p>Sebbene <em>sia possibile<\/em> integrare il pooling delle connessioni nella logica dell&#8217;applicazione, molti optano per uno strumento di terze parti e nel caso di Postgres si tratta di <strong><a href=\"https:\/\/www.pgbouncer.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">PGBouncer<\/a><\/strong>. Si tratta di un connection pooler open source e leggero che si pu\u00f2 installare <a href=\"https:\/\/www.pgbouncer.org\/faq.html\" target=\"_blank\" rel=\"noopener noreferrer\">o<\/a> sul server del database o su quello dell&#8217;applicazione. Si pu\u00f2 scegliere tra <a href=\"https:\/\/www.pgbouncer.org\/features.html\" target=\"_blank\" rel=\"noopener noreferrer\">tre livelli di pooling<\/a>:<\/p>\n<ul>\n<li><strong>Session pooling<\/strong>: rimane fedele al modello &#8220;le connessioni del client sono indefinite&#8221; e mantiene aperta una connessione per tutto il tempo in cui il client \u00e8 connesso.<\/li>\n<li><strong>Transaction pooling<\/strong>: le connessioni durano per una singola transazione, dopodich\u00e9 vengono rimandate al pool.<\/li>\n<li><strong>Statement pooling<\/strong>: le connessioni durano solo per una query, quindi se se ne ha pi\u00f9 di una come parte di una transazione, non funzionerebbe affatto.<\/li>\n<\/ul>\n<p>Molti scelgono il session pooling: \u00e8 la soluzione pi\u00f9 conservativa e meno rischiosa per l&#8217;interruzione delle connessioni, ma ogni applicazione \u00e8 diversa e dovrete capire qual \u00e8 la modalit\u00e0 giusta per i vostri vincoli.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>La maggior parte dei framework web lascia la scelta a strumenti di terze parti (date un&#8217;occhiata a <a href=\"https:\/\/groups.google.com\/g\/django-developers\/c\/NwY9CHM4xpU\">questo thread del forum di Django<\/a> su PGBouncer), ma Rails offre una <a href=\"https:\/\/api.rubyonrails.org\/classes\/ActiveRecord\/ConnectionAdapters\/ConnectionPool.html\">funzione nativa di pooling delle connessioni<\/a>.<\/p>\n<\/aside>\n\n<h3>L&#8217;impatto sulle prestazioni del pool di connessioni<\/h3>\n<p>La domanda da un milione di dollari, per\u00f2, \u00e8: <strong>funziona davvero?<\/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 ha eseguito<\/a> una serie di benchmark per capire l&#8217;impatto di PGBouncer sulle prestazioni. Con un numero ridotto di client contemporanei (&lt;60), PGBouncer <em>riduce di molto le<\/em> transazioni al secondo (TPS) a causa dell&#8217;overhead del pooling. Ma quando si scala a oltre 100 client, si iniziano a vedere benefici significativi in termini di prestazioni.<\/p>\n<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>\n<p>Avete quindi bisogno di un pooler di connessioni per supportare i vostri primi utenti? Probabilmente no. Ma l&#8217;utilizzo di PGBouncer vi aiuter\u00e0 una volta raggiunto un traffico anche basso\/moderato.<\/p>\n<h2>Sicurezza di Postgres per principianti<\/h2>\n<p>Per le prime settimane di lavoro sul progetto, quando di solito ci sono solo uno o due sviluppatori che lavorano su un database vuoto, la sicurezza non \u00e8 un aspetto fondamentale. Ma quando lancerete l&#8217;applicazione, dovr\u00e0 esserlo. E con i database, a volte sembra che esistano <a href=\"https:\/\/www.postgresql.org\/docs\/7.0\/security.htm\" target=\"_blank\" rel=\"noopener noreferrer\">un milione di modi diversi per bloccare tutto<\/a>.<\/p>\n<h3>Limitare l&#8217;accesso a livello di host o di utente<\/h3>\n<p>Iniziamo con l&#8217;accesso. Postgres limita l&#8217;accesso in due modi:<\/p>\n<ol start=\"1\">\n<li>A <strong>livello di host<\/strong>: definendo indirizzi IP e domini con diritti di accesso<\/li>\n<li>A <strong>livello di utente<\/strong>: definendo gli utenti del database e le loro autorizzazioni<\/li>\n<\/ol>\n<p>Il <a href=\"https:\/\/www.postgresql.org\/docs\/current\/auth-pg-hba-conf.html\" target=\"_blank\" rel=\"noopener noreferrer\">file <strong>pg_hba.conf<\/strong><\/a> nella directory PGDATA \u00e8 il luogo in cui si definisce chi pu\u00f2 connettersi a quali database. Se non c&#8217;\u00e8 una voce per un client, questo non potr\u00e0 accedere al database. Supponendo che il vostro application server sia in esecuzione da un&#8217;altra parte, ecco come potreste permettergli di accedere al database:<\/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>Al di fuori del semplice &#8220;fidati di qualsiasi connessione da questa macchina&#8221;, ci sono molti modi diversi per <a href=\"https:\/\/www.postgresql.org\/docs\/current\/client-authentication.html\" target=\"_blank\" rel=\"noopener noreferrer\">autenticare il client con il server del database<\/a>, dalla password all&#8217;ident ai certificati. Inoltre, se avete rinunciato alle grandi comodit\u00e0 di RDS (o Kinsta) e state eseguendo il backend sullo stesso server del database, potete <a href=\"https:\/\/www.postgresql.org\/docs\/current\/runtime-config-connection.html\" target=\"_blank\" rel=\"noopener noreferrer\">connettervi tramite socket Unix<\/a> invece che tramite TCP\/IP.<\/p>\n<h3>Autorizzazione e privilegi<\/h3>\n<p>Una volta che il client sar\u00e0 autenticato, dovrete occuparvi della questione dell&#8217;autorizzazione. Lo standard SQL definisce un sistema di privilegi e ogni oggetto di Postgres (come una tabella, una riga, ecc.) ha diversi privilegi che possono essere assegnati agli utenti: ad esempio <code>SELECT<\/code> e <code>UPDATE<\/code>, ma anche <code>TRUNCATE<\/code>, <code>REFERENCES<\/code>, <code>TRIGGER<\/code>, ecc. Si possono assegnare i privilegi agli utenti con il 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 prassi migliore \u00e8 quella di seguire il principio del minimo privilegio, quindi l&#8217;utente del database che create per i vostri client deve <em>poter<\/em> accedere solo a ci\u00f2 che gli <em>serve<\/em>.<\/p>\n<h3>Sicurezza a livello di riga<\/h3>\n<p>L&#8217;ultimo aspetto da trattare \u00e8 <strong><a href=\"https:\/\/www.postgresql.org\/docs\/current\/ddl-rowsecurity.html\" target=\"_blank\" rel=\"noopener noreferrer\">la sicurezza a livello di riga<\/a><\/strong>. La sicurezza a livello di riga esiste dal punto di vista della tabella (non dell&#8217;utente) e limita l&#8217;accesso alle righe, il loro aggiornamento, ecc. Per impostazione predefinita, le tabelle non hanno l&#8217;RLS abilitato, quindi gli utenti potranno fare tutto ci\u00f2 che le loro politiche di accesso impongono. Per abilitare l&#8217;RLS per una tabella, dovrete iniziare con:<\/p>\n<pre><code class=\"language-sql\">ALTER TABLE [table_name] ENABLE ROW LEVEL SECURITY<\/code><\/pre>\n<p>E poi aggiungere un criterio. Supponiamo di voler limitare l&#8217;accesso in lettura alla tabella <strong>lightsaber_internals<\/strong> a persone fidate, che sono gi\u00e0 definite nel gruppo di utenti <strong>jedi<\/strong>, in modo che solo il proprietario di una <em>lightsaber<\/em> (una spada laser) possa vedere i suoi dettagli interni. Ecco come fare:<\/p>\n<pre><code class=\"language-sql\">ALTER TABLE lightsaber_internals ENABLE ROW LEVEL SECURITY\nCREATE POLICY jedi_only ON lightsaber_internals TO jedi\n    USING (jedi = lightsaber_jedi);<\/code><\/pre>\n<p>Politiche RLS come questa sono utili quando si ha bisogno di sicurezza a un livello pi\u00f9 granulare rispetto alle sole tabelle (situazioni con PII, ecc.).<\/p>\n<h2>Pensare in anticipo ai problemi di scalabilit\u00e0<\/h2>\n<p>In tutte le startup in cui ho lavorato, c&#8217;\u00e8 stato un certo livello di scalabilit\u00e0 manuale per quanto riguarda il database. Un giorno vi sveglierete e Datadog dar\u00e0 di matto perch\u00e9 il server Postgres \u00e8 completamente esaurito. Indagherete, aggiornerete la pagina degli incidenti e alla fine aggiornerete le dimensioni del disco fino a quando non succeder\u00e0 di nuovo (anche se la prossima volta potrebbe essere un problema di RAM). Anticipare questi problemi pu\u00f2 essere utile! Alcuni suggerimenti:<\/p>\n<h3>1. Impostare il monitoraggio del database<\/h3>\n<p>La maggior parte delle aziende in cui ho lavorato utilizza <a href=\"https:\/\/www.datadoghq.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Datadog<\/a> per il monitoraggio dei database. Se utilizzate un servizio di database gestito, potete probabilmente cavarvela utilizzando i loro strumenti nativi. Datadog ha pubblicato un <a href=\"https:\/\/www.datadoghq.com\/blog\/postgresql-monitoring\/\" target=\"_blank\" rel=\"noopener noreferrer\">ottimo post sul suo blog<\/a> che illustra le principali metriche da tenere sotto controllo, come il throughput di lettura e scrittura, le scansioni sequenziali, i dati scritti su disco, ecc.<\/p>\n<h3>2. Mettere insieme le linee guida per scalare verticalmente<\/h3>\n<p>Quando il vostro team verr\u00e0 chiamato &#8220;a rapporto&#8221; &#8211; e succeder\u00e0 &#8211; l&#8217;ultima cosa che vorrete \u00e8 che tutti si mettano all&#8217;opera per risolvere il problema, quando nella maggior parte dei casi un semplice scaling risolverebbe il problema. \u00c8 bene mettere a punto un piano di base per il team su ci\u00f2 che rientra nell&#8217;ambito di applicazione quando si \u00e8 a corto di spazio o di calcolo.<\/p>\n<h3>3. Vacuuming e messa a punto dell&#8217;auto-vacuuming<\/h3>\n<p>Quando si esegue un <code>DELETE<\/code> dati in Postgres o un <code>UPDATE<\/code> dei dati (che \u00e8 funzionalmente equivalente all&#8217;eliminazione e all&#8217;inserimento), Postgres <a href=\"https:\/\/www.2ndquadrant.com\/en\/blog\/autovacuum-tuning-basics\/\" target=\"_blank\" rel=\"noopener noreferrer\">non li elimina<\/a> subito (\ud83d\ude31). Invece, vengono &#8220;marcati&#8221; come eliminati memorizzando l&#8217;ID della transazione dell&#8217;eliminazione in un&#8217;intestazione <strong>xmax<\/strong>; il motivo di questa scelta \u00e8 che rende pi\u00f9 semplice l&#8217;MVCC in Postgres. Ma se queste righe non vengono <em>davvero<\/em> cancellate, occuperanno spazio su disco e finiranno per creare problemi.<\/p>\n<p>Il modo pi\u00f9 semplice per eliminare queste righe \u00e8 utilizzare il comando <code><a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-vacuum.html\" target=\"_blank\" rel=\"noopener noreferrer\">VACUUM<\/a><\/code> . Potreste eseguire un vacuuming manuale ogni volta che si accumulano righe morte o anche solo impostarlo in modo che venga eseguito ogni x minuti, ma una strategia migliore \u00e8 quella di eseguire l&#8217;auto-vacuuming in base al numero di righe morte accumulate. La regolazione dell&#8217;auto-vacuuming \u00e8 un argomento complesso che esula dagli scopi di questo post: vi consiglio di leggere il <a href=\"https:\/\/www.2ndquadrant.com\/en\/blog\/autovacuum-tuning-basics\/\" target=\"_blank\" rel=\"noopener noreferrer\">post di 2ndQuadrant al riguardo<\/a>.<\/p>\n<h3>4. Impostare una (o due) repliche di lettura<\/h3>\n<p>Questo \u00e8 facile. Se prevedete un aumento significativo del traffico (un lancio imminente, ecc.), potete facilmente creare delle repliche di sola lettura (o almeno una); vi aiuteranno ad alleggerire un po&#8217; il lavoro dell&#8217;istanza del DB principale.<\/p>\n<p>Se optate per pi\u00f9 repliche, otterrete l&#8217;ulteriore vantaggio di migliorare la disponibilit\u00e0 nel caso in cui una di esse vada in tilt per qualsiasi motivo. Aggiungere repliche \u00e8 piuttosto semplice nella maggior parte dei fornitori di DBaaS, ma tenete d&#8217;occhio i costi: spesso hanno lo stesso prezzo di un&#8217;istanza DB principale, nonostante siano di sola lettura.<\/p>\n<h2>Aggiungere indici alle tabelle pi\u00f9 grandi (previste)<\/h2>\n<p>Gli indici di database aiutano a velocizzare le query di lettura creando strutture di dati ausiliarie che rendono le scansioni pi\u00f9 veloci. Per molti casi d&#8217;uso, l&#8217;aggiunta di un indice a una o due tabelle non \u00e8 affatto un problema. In Postgres, potete creare un indice con il comando <code><a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-createindex.html\" target=\"_blank\" rel=\"noopener noreferrer\">CREATE INDEX<\/a><\/code> (ovvio). Quando interrogate una tabella, il database controlla se esiste un indice e, in caso affermativo, lo utilizza (potete verificare che questo avvenga con <code><a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-explain.html\" target=\"_blank\" rel=\"noopener noreferrer\">EXPLAIN<\/a><\/code>, a proposito).<\/p>\n<p>Il tipo di indice pi\u00f9 diffuso in Postgres &#8211; e quello predefinito quando si utilizza <code>CREATE INDEX<\/code> &#8211; \u00e8 un <strong>indice B-Tree<\/strong>. In sostanza, prende la colonna su cui volete creare un indice, la ordina e memorizza i puntatori alle righe ordinate. In questo modo, potete ottenere l&#8217;efficienza della ricerca binaria su qualsiasi colonna vogliate, non solo su quella su cui \u00e8 ordinata la tabella attuale (ammesso che ce ne sia una). Potete leggere maggiori dettagli su come vengono implementati questi alberi nei documenti di Postgres <a href=\"https:\/\/www.postgresql.org\/docs\/current\/btree-implementation.html\" target=\"_blank\" rel=\"noopener noreferrer\">qui<\/a>.<\/p>\n<p>Sebbene siano utili, gli indici non sono tutti una passeggiata da gestire: occupano spazio e, se non state attenti al numero e al tipo di indici che create, possono iniziare a peggiorare le prestazioni del database. Nessuno lo dice meglio dei <a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-createindex.html\" target=\"_blank\" rel=\"noopener noreferrer\">documenti di Postgres<\/a>:<\/p>\n<p><em>&#8220;Gli indici sono utilizzati principalmente per migliorare le prestazioni del database (anche se un uso inappropriato pu\u00f2 causare un rallentamento delle prestazioni)&#8221;<br \/>\n<\/em><br \/>\nQuando create un indice, Postgres crea una tabella di ricerca che contiene l&#8217;indice e un puntatore al record dell&#8217;indice. Troppe tabelle di questo tipo occupano spazio su disco, allungano i tempi delle query INSERT e costringono il motore di ricerca a considerare pi\u00f9 opzioni prima di scegliere come eseguire una query.<\/p>\n<h2>Bonus: aggiungere alcune estensioni di Postgres<\/h2>\n<p>Un aspetto che rende Postgres unico \u00e8 il <a href=\"https:\/\/www.postgresql.org\/docs\/15\/external-extensions.html\" target=\"_blank\" rel=\"noopener noreferrer\">supporto nativo<\/a> per le estensioni di terze parti. \u00c8 possibile crearle con SQL e C e possono essere piccole come un paio di istruzioni o grandi come un&#8217;intera libreria di software. L&#8217;uso di <a href=\"https:\/\/gist.github.com\/joelonsql\/e5aa27f8cc9bd22b8999b7de8aee9d47#file-postgresql-extensions-md\" target=\"_blank\" rel=\"noopener noreferrer\">estensioni disponibili pubblicamente o open source<\/a> aiuta, come l&#8217;uso di un pacchetto software: perch\u00e9 scrivere il codice quando potete usare quello di qualcun altro? Ecco alcune delle estensioni di Postgres pi\u00f9 popolari:<\/p>\n<h3>Timescale<\/h3>\n<p><a href=\"https:\/\/www.timescale.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Timescale<\/a> \u00e8 un&#8217;estensione di Postgres per lavorare con i dati delle serie temporali. In breve, rende le query (molto) pi\u00f9 veloci e memorizza i dati delle serie temporali in modo molto efficiente. Potete trovare le istruzioni per l&#8217;installazione <a href=\"https:\/\/docs.timescale.com\/self-hosted\/latest\/install\/\" target=\"_blank\" rel=\"noopener noreferrer\">qui<\/a>, oppure prendere in considerazione l&#8217;opzione cloud-hosted di Timescale se volete davvero gestire la vostra attivit\u00e0 con i dati delle serie temporali (anche se probabilmente ne siete gi\u00e0 a conoscenza).<\/p>\n<h3>PostGIS<\/h3>\n<p><a href=\"https:\/\/postgis.net\/\" target=\"_blank\" rel=\"noopener noreferrer\">PostGIS<\/a> aggiunge a Postgres il supporto per l&#8217;archiviazione, l&#8217;indicizzazione e l&#8217;interrogazione di dati geografici (linee, poligoni, localit\u00e0, ecc.). Se utilizzate un provider cloud, la maggior parte di essi preinstalla PostGIS. Se invece dovete installarlo voi stessi, potete trovare le istruzioni per l&#8217;installazione <a href=\"https:\/\/postgis.net\/documentation\/getting_started\/\" target=\"_blank\" rel=\"noopener noreferrer\">qui<\/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 nel database Postgres con le statistiche di ogni query eseguita sul database. potete vedere statistiche come il tempo di esecuzione della query (mean, median, average, ecc.), chi ha eseguito la query, le visite alla cache dei blocchi, il numero di blocchi scritti e molto altro (44 colonne totali in questa vista). <a href=\"https:\/\/gist.github.com\/rcanepa\/535163dc249539912c25\" target=\"_blank\" rel=\"noopener noreferrer\">Per installarlo<\/a>, basta aggiungerlo al file .conf e riavviare il server.<\/p>\n<h3>pg_audit<\/h3>\n<p><a href=\"https:\/\/www.pgaudit.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">pg_audit<\/a> \u00e8 utile per le aziende che potrebbero essere soggette a controlli dettagliati (ad esempio governativi, finanziari, ecc.). Potete fare in modo che Postgres registri ogni singola dichiarazione sul database impostando `log_statement=all`, ma questo non significa che le informazioni di cui avete bisogno saranno facili da cercare e trovare. pg_audit utilizza le funzioni di log interne di Postgres per rendere pi\u00f9 facile trovare e lavorare con i log di cui un revisore potrebbe aver bisogno. Potete trovare le istruzioni per l&#8217;installazione <a href=\"https:\/\/github.com\/pgaudit\/pgaudit\" target=\"_blank\" rel=\"noopener noreferrer\">qui<\/a>.<\/p>\n<h2>Riepilogo<\/h2>\n<p>Postgres \u00e8 un&#8217;opzione fantastica (e <a href=\"https:\/\/clearbit.com\/resources\/books\/data-driven-marketing\/b2b-seo-content-that-ranks\" target=\"_blank\" rel=\"noopener noreferrer\">molto popolare<\/a>) su cui costruire la vostra azienda e che noi di Kinsta siamo orgogliosi di supportare. Ci auguriamo che questi consigli vi aiutino a diventare operativi e pronti a scalare. Altri consigli o riflessioni sulla vostra esperienza? Fatecelo sapere qui.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>State per iniziare un nuovo progetto &#8211; o per avviare una nuova azienda &#8211; e avete deciso di affidarvi a Postgres. La parte difficile (la scelta &#8230;<\/p>\n","protected":false},"author":310,"featured_media":75540,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[26213],"class_list":["post-75539","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>Il manuale del CTO di una startup per lavorare con Postgres - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Scopri alcuni trucchi meno noti per configurare Postgres a lungo termine, dal pooling delle connessioni alle nozioni di base sulla sicurezza, fino alle estensioni e agli indici.\" \/>\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\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Il manuale del CTO di una startup per lavorare con Postgres\" \/>\n<meta property=\"og:description\" content=\"Scopri alcuni trucchi meno noti per configurare Postgres a lungo termine, dal pooling delle connessioni alle nozioni di base sulla sicurezza, fino alle estensioni e agli indici.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstaitalia\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-12-14T12:13:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-12-15T11:40:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/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=\"Scopri alcuni trucchi meno noti per configurare Postgres a lungo termine, dal pooling delle connessioni alle nozioni di base sulla sicurezza, fino alle estensioni e agli indici.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Justin Gage\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/\"},\"author\":{\"name\":\"Justin Gage\",\"@id\":\"https:\/\/kinqsta.com\/it\/#\/schema\/person\/9c79ef0f55180723ff2b31baffe9070f\"},\"headline\":\"Il manuale del CTO di una startup per lavorare con Postgres\",\"datePublished\":\"2023-12-14T12:13:47+00:00\",\"dateModified\":\"2023-12-15T11:40:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/\"},\"wordCount\":2131,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/it\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\",\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/\",\"url\":\"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/\",\"name\":\"Il manuale del CTO di una startup per lavorare con Postgres - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\",\"datePublished\":\"2023-12-14T12:13:47+00:00\",\"dateModified\":\"2023-12-15T11:40:41+00:00\",\"description\":\"Scopri alcuni trucchi meno noti per configurare Postgres a lungo termine, dal pooling delle connessioni alle nozioni di base sulla sicurezza, fino alle estensioni e agli indici.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/#primaryimage\",\"url\":\"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\",\"contentUrl\":\"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinqsta.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL\",\"item\":\"https:\/\/kinqsta.com\/it\/argomenti\/postgresql\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Il manuale del CTO di una startup per lavorare con Postgres\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinqsta.com\/it\/#website\",\"url\":\"https:\/\/kinqsta.com\/it\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluzioni di hosting premium, veloci e sicure\",\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/it\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinqsta.com\/it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinqsta.com\/it\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinqsta.com\/it\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinqsta.com\/it\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/it\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstaitalia\/\",\"https:\/\/x.com\/Kinsta_IT\",\"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\/it\/#\/schema\/person\/9c79ef0f55180723ff2b31baffe9070f\",\"name\":\"Justin Gage\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinqsta.com\/it\/#\/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\/it\/blog\/author\/justingage\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Il manuale del CTO di una startup per lavorare con Postgres - Kinsta\u00ae","description":"Scopri alcuni trucchi meno noti per configurare Postgres a lungo termine, dal pooling delle connessioni alle nozioni di base sulla sicurezza, fino alle estensioni e agli indici.","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\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/","og_locale":"it_IT","og_type":"article","og_title":"Il manuale del CTO di una startup per lavorare con Postgres","og_description":"Scopri alcuni trucchi meno noti per configurare Postgres a lungo termine, dal pooling delle connessioni alle nozioni di base sulla sicurezza, fino alle estensioni e agli indici.","og_url":"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstaitalia\/","article_published_time":"2023-12-14T12:13:47+00:00","article_modified_time":"2023-12-15T11:40:41+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","type":"image\/jpeg"}],"author":"Justin Gage","twitter_card":"summary_large_image","twitter_description":"Scopri alcuni trucchi meno noti per configurare Postgres a lungo termine, dal pooling delle connessioni alle nozioni di base sulla sicurezza, fino alle estensioni e agli indici.","twitter_image":"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","twitter_creator":"@Kinsta_IT","twitter_site":"@Kinsta_IT","twitter_misc":{"Scritto da":"Justin Gage","Tempo di lettura stimato":"11 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/#article","isPartOf":{"@id":"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/"},"author":{"name":"Justin Gage","@id":"https:\/\/kinqsta.com\/it\/#\/schema\/person\/9c79ef0f55180723ff2b31baffe9070f"},"headline":"Il manuale del CTO di una startup per lavorare con Postgres","datePublished":"2023-12-14T12:13:47+00:00","dateModified":"2023-12-15T11:40:41+00:00","mainEntityOfPage":{"@id":"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/"},"wordCount":2131,"commentCount":0,"publisher":{"@id":"https:\/\/kinqsta.com\/it\/#organization"},"image":{"@id":"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/","url":"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/","name":"Il manuale del CTO di una startup per lavorare con Postgres - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinqsta.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/#primaryimage"},"image":{"@id":"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","datePublished":"2023-12-14T12:13:47+00:00","dateModified":"2023-12-15T11:40:41+00:00","description":"Scopri alcuni trucchi meno noti per configurare Postgres a lungo termine, dal pooling delle connessioni alle nozioni di base sulla sicurezza, fino alle estensioni e agli indici.","breadcrumb":{"@id":"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/#primaryimage","url":"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","contentUrl":"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinqsta.com\/it\/blog\/manuale-cto-startup-per-lavorare-con-postgres\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinqsta.com\/it\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL","item":"https:\/\/kinqsta.com\/it\/argomenti\/postgresql\/"},{"@type":"ListItem","position":3,"name":"Il manuale del CTO di una startup per lavorare con Postgres"}]},{"@type":"WebSite","@id":"https:\/\/kinqsta.com\/it\/#website","url":"https:\/\/kinqsta.com\/it\/","name":"Kinsta\u00ae","description":"Soluzioni di hosting premium, veloci e sicure","publisher":{"@id":"https:\/\/kinqsta.com\/it\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinqsta.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/kinqsta.com\/it\/#organization","name":"Kinsta","url":"https:\/\/kinqsta.com\/it\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinqsta.com\/it\/#\/schema\/logo\/image\/","url":"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinqsta.com\/it\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstaitalia\/","https:\/\/x.com\/Kinsta_IT","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\/it\/#\/schema\/person\/9c79ef0f55180723ff2b31baffe9070f","name":"Justin Gage","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinqsta.com\/it\/#\/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\/it\/blog\/author\/justingage\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinqsta.com\/it\/wp-json\/wp\/v2\/posts\/75539","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinqsta.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinqsta.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/it\/wp-json\/wp\/v2\/users\/310"}],"replies":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/it\/wp-json\/wp\/v2\/comments?post=75539"}],"version-history":[{"count":5,"href":"https:\/\/kinqsta.com\/it\/wp-json\/wp\/v2\/posts\/75539\/revisions"}],"predecessor-version":[{"id":75553,"href":"https:\/\/kinqsta.com\/it\/wp-json\/wp\/v2\/posts\/75539\/revisions\/75553"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinqsta.com\/it\/wp-json\/kinsta\/v1\/posts\/75539\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinqsta.com\/it\/wp-json\/kinsta\/v1\/posts\/75539\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinqsta.com\/it\/wp-json\/kinsta\/v1\/posts\/75539\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinqsta.com\/it\/wp-json\/kinsta\/v1\/posts\/75539\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinqsta.com\/it\/wp-json\/kinsta\/v1\/posts\/75539\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinqsta.com\/it\/wp-json\/kinsta\/v1\/posts\/75539\/translations\/jp"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinqsta.com\/it\/wp-json\/kinsta\/v1\/posts\/75539\/translations\/es"},{"href":"https:\/\/kinqsta.com\/it\/wp-json\/kinsta\/v1\/posts\/75539\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/it\/wp-json\/wp\/v2\/media\/75540"}],"wp:attachment":[{"href":"https:\/\/kinqsta.com\/it\/wp-json\/wp\/v2\/media?parent=75539"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinqsta.com\/it\/wp-json\/wp\/v2\/tags?post=75539"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinqsta.com\/it\/wp-json\/wp\/v2\/topic?post=75539"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}