PageSourceSearch

https://bucketeer.io/assets/js/9527c3a1.25e9ff3b.js

js bucketeer.io collected 2026-10-04 21:05:27 UTC 13,369 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8704],{28453:(e,s,t)=>{t.d(s,{RP:()=>o,xA:()=>i});var r=t(96540);const n=r.createContext({});function o(e){const s=r.useContext(n);return r.useMemo((()=>"function"==typeof e?e(s):{...s,...e}),[s,e])}const a={};function i({components:e,children:s,disableParentContext:t}){let i;return i=t?"function"==typeof e?e({}):e||a:o(e),r.createElement(n.Provider,{value:i},s)}},34958:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>d});var r=t(83147),n=t(74848),o=t(28453);const a={title:"Introducing PostgreSQL as a Data Warehouse Option",slug:"introducing-postgresql-data-warehouse",authors:["hien-vu-ngoc"],tags:["postgresql","data-warehouse","release","bucketeer-lite"],hide_table_of_contents:!1,date:"2026-03-05T12:00",description:"Bucketeer supports PostgreSQL as a data warehouse option alongside BigQuery and MySQL, with TimescaleDB available for OLAP workloads.",image:"/img/bucketeer-ogp-logo.png"},i="Introducing PostgreSQL as a Data Warehouse Option",l={authorsImageUrls:[void 0]},d=[{value:"Why add PostgreSQL?",id:"why-add-postgresql",level:2},{value:"What's Included",id:"whats-included",level:2},{value:"When to Use Which (Usage)",id:"when-to-use-which-usage",level:3},{value:"How PostgreSQL compares",id:"how-postgresql-compares",level:3},{value:"How to Get Started",id:"how-to-get-started",level:2},{value:"What's next",id:"whats-next",level:2}];function c(e){const s={a:"a",h2:"h2",h3:"h3",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.RP)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.strong,{children:"PostgreSQL"})," is now supported as a ",(0,n.jsx)(s.strong,{children:"data warehouse (DWH) option"})," in Bucketeer 2.2.0, alongside BigQuery and MySQL. We added it because Postgres supports ",(0,n.jsx)(s.strong,{children:(0,n.jsx)(s.a,{href:"https://www.timescale.com/",children:"TimescaleDB"})}),", which fits OLAP-style event and analytics workloads well."]}),"\n",(0,n.jsx)(s.h2,{id:"why-add-postgresql",children:"Why add PostgreSQL?"}),"\n",(0,n.jsxs)(s.p,{children:["Bucketeer has supported ",(0,n.jsx)(s.strong,{children:"BigQuery"})," (GCP) and ",(0,n.jsx)(s.strong,{children:"MySQL"})," (for ",(0,n.jsx)(s.a,{href:"https://bucketeer.io/blog/introducing-bucketeer-lite-run-anywhere-with-docker-compose",children:"Bucketeer Lite"})," and self-hosted) for some time. We added ",(0,n.jsx)(s.strong,{children:"PostgreSQL"})," because it supports ",(0,n.jsx)(s.strong,{children:"TimescaleDB"}),", an extension that targets OLAP (analytical) workloads: hypertables, time-based partitioning, and compression suit the event and time-series data that the DWH stores. You can run plain PostgreSQL or PostgreSQL with TimescaleDB. That gives you a self-hosted option with analytical capabilities in the same vein as BigQuery, without tying you to GCP."]}),"\n",(0,n.jsx)(s.h2,{id:"whats-included",children:"What's Included"}),"\n",(0,n.jsxs)(s.p,{children:["PostgreSQL is supported as a ",(0,n.jsx)(s.strong,{children:"data warehouse"})," \u2014 the store for goal and evaluation events and event counters that power A/B testing and analytics. The same flow as with MySQL applies: events are written by the subscriber and event counter services into Postgres."]}),"\n",(0,n.jsx)(s.p,{children:"What\u2019s in scope:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.strong,{children:"PostgreSQL client and storage"})," for goal/evaluation events and event counters (mirroring the existing MySQL DWH behavior)."]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.strong,{children:"Subscriber and event counter services"})," updated to support PostgreSQL."]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.strong,{children:"Docker Compose"})," and ",(0,n.jsx)(s.strong,{children:"Kubernetes/Helm"})," (and dev container) support so you can run Bucketeer with Postgres as the DWH."]}),"\n"]}),"\n",(0,n.jsxs)(s.p,{children:["Implementation details and schema are in the ",(0,n.jsx)(s.a,{href:"https://github.com/bucketeer-io/bucketeer",children:"Bucketeer repository"}),"; this post stays high level."]}),"\n",(0,n.jsx)(s.h3,{id:"when-to-use-which-usage",children:"When to Use Which (Usage)"}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Option"}),(0,n.jsx)(s.th,{children:"Best for"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.strong,{children:"BigQuery"})}),(0,n.jsxs)(s.td,{children:["Full Bucketeer on ",(0,n.jsx)(s.strong,{children:"Google Cloud"})," \u2014 when you want managed analytics and are already on GCP (Pub/Sub, GKE, etc.)."]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.strong,{children:"MySQL"})}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.strong,{children:"Bucketeer Lite"})," or self-hosted \u2014 when you prefer MySQL for the DWH or already run MySQL elsewhere. Works with Docker Compose and Kubernetes."]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.strong,{children:"PostgreSQL"})}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.strong,{children:"Bucketeer Lite"})," or self-hosted \u2014 when you want a self-hosted DWH with optional ",(0,n.jsx)(s.strong,{children:"TimescaleDB"})," for OLAP/analytics. Same deployment options as MySQL (Docker Compose, K8s)."]})]})]})]}),"\n",(0,n.jsx)(s.h3,{id:"how-postgresql-compares",children:"How PostgreSQL compares"}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"Hosting and deployment"})}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.strong,{children:"BigQuery"})," \u2014 Managed service on GCP. You need a GCP project, IAM, and a BigQuery dataset. Messaging is Google Pub/Sub. Suited when the rest of Bucketeer (and your stack) already runs on GCP."]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.strong,{children:"MySQL"})," \u2014 Self-hosted. You run MySQL yourself (Docker Compose or Kubernetes/Helm). With Bucketeer Lite, messaging is Redis Streams. No cloud lock-in; you operate the database."]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.strong,{children:"PostgreSQL"})," \u2014 Same idea as MySQL: self-hosted, Docker Compose or Kubernetes/Helm, Redis Streams for Lite. The difference is the engine and the extension ecosystem (notably TimescaleDB)."]}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"Analytics and OLAP"})}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.strong,{children:"BigQuery"})," \u2014 Built for large-scale analytics: columnar storage, distributed queries, no schema or capacity management on your side. You pay for storage and query usage."]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.strong,{children:"MySQL"})," \u2014 General-purpose relational store. Works well for the DWH\u2019s event and counter tables; analytical queries are fine at moderate scale. No built-in time-series or OLAP extensions in the same way as TimescaleDB."]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.strong,{children:"PostgreSQL"})," \u2014 General-purpose too, with stronger analytical SQL (e.g. window functions, CTEs, JSON). ",(0,n.jsx)(s.strong,{children:(0,n.jsx)(s.a,{href:"https://www.timescale.com/",children:"TimescaleDB"})})," extends it for OLAP and time-series: hypertables (automatic time-based partitioning), compression, and query patterns that fit event and analytics workloads. You can run plain PostgreSQL or enable TimescaleDB depending on how analytical you need to get."]}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"Scale and cost"})}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.strong,{children:"BigQuery"})," \u2014 Intended for ",(0,n.jsx)(s.strong,{children:"larger scope"}),": high volume (e.g. millions of messages), managed scaling, pay-per-use. Fits when you need that scale and are on GCP."]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.strong,{children:"MySQL"})," and ",(0,n.jsx)(s.strong,{children:"PostgreSQL"})," \u2014 ",(0,n.jsx)(s.strong,{children:"Cost savers for smaller projects"}),". You run the database yourself (Docker or K8s), so there\u2019s no per-query or per-message cloud bill. Suited for lower to moderate event volume and team
1s that prefer to own infra and control cost."]}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"Summary"})}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Aspect"}),(0,n.jsx)(s.th,{children:"BigQuery"}),(0,n.jsx)(s.th,{children:"MySQL"}),(0,n.jsx)(s.th,{children:"PostgreSQL"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.strong,{children:"Hosting"})}),(0,n.jsx)(s.td,{children:"GCP only, managed"}),(0,n.jsx)(s.td,{children:"Self-hosted"}),(0,n.jsx)(s.td,{children:"Self-hosted"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.strong,{children:"Typical scale"})}),(0,n.jsx)(s.td,{children:"Large (e.g. millions of messages)"}),(0,n.jsx)(s.td,{children:"Smaller projects, cost-conscious"}),(0,n.jsx)(s.td,{children:"Smaller projects, cost-conscious"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.strong,{children:"OLAP / time-series"})}),(0,n.jsx)(s.td,{children:"Native (managed)"}),(0,n.jsx)(s.td,{children:"General SQL"}),(0,n.jsx)(s.td,{children:"General SQL + optional TimescaleDB"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.strong,{children:"Operations"})}),(0,n.jsx)(s.td,{children:"Minimal (managed)"}),(0,n.jsx)(s.td,{children:"You operate DB"}),(0,n.jsx)(s.td,{children:"You operate DB"})]})]})]}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.strong,{children:"BigQuery"})," when you need large-scale, managed analytics on GCP; ",(0,n.jsx)(s.strong,{children:"MySQL"})," or ",(0,n.jsx)(s.strong,{children:"PostgreSQL"})," when you want a ",(0,n.jsx)(s.strong,{children:"cost-effective"}),", self-hosted DWH for smaller or moderate traffic. On Postgres, ",(0,n.jsx)(s.strong,{children:"TimescaleDB"})," is an optional extension for OLAP-oriented event and time-series storage."]}),"\n",(0,n.jsx)(s.h2,{id:"how-to-get-started",children:"How to Get Started"}),"\n",(0,n.jsx)(s.p,{children:"PostgreSQL as a data warehouse is available. To try it:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["Check the ",(0,n.jsx)(s.a,{href:"https://github.com/bucketeer-io/bucketeer",children:"Bucketeer repository"})," for Docker Compose and Kubernetes/Helm configuration and the event table setup steps."]}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"whats-next",children:"What's next"}),"\n",(0,n.jsxs)(s.p,{children:["PostgreSQL support in this release is for the ",(0,n.jsx)(s.strong,{children:"data warehouse"})," (event and analytics storage) only. We\u2019re also working on ",(0,n.jsx)(s.strong,{children:"PostgreSQL as a data storage alternative"})," for the main application \u2014 the same place MySQL is used today for the console and core data. When that lands, you\u2019ll be able to run Bucketeer Lite or self-hosted with PostgreSQL for both storage and DWH, alongside the existing MySQL option."]})]})}function h(e={}){const{wrapper:s}={...(0,o.RP)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},83147:e=>{e.exports=JSON.parse('{"permalink":"/blog/introducing-postgresql-data-warehouse","source":"@site/blog/2026/2026-03-05-introducing-postgresql-data-warehouse.md","title":"Introducing PostgreSQL as a Data Warehouse Option","description":"Bucketeer supports PostgreSQL as a data warehouse option alongside BigQuery and MySQL, with TimescaleDB available for OLAP workloads.","date":"2026-03-05T12:00:00.000Z","tags":[{"inline":true,"label":"postgresql","permalink":"/blog/tags/postgresql"},{"inline":true,"label":"data-warehouse","permalink":"/blog/tags/data-warehouse"},{"inline":true,"label":"release","permalink":"/blog/tags/release"},{"inline":true,"label":"bucketeer-lite","permalink":"/blog/tags/bucketeer-lite"}],"readingTime":3.98,"hasTruncateMarker":true,"authors":[{"name":"Hien Vu Ngoc","title":"Software Engineer","url":"https://github.com/hvn2k1","page":{"permalink":"/blog/authors/hien-vu-ngoc"},"socials":{"github":"https://github.com/hvn2k1"},"imageURL":"/img/members/hien-vu-ngoc.png","key":"hien-vu-ngoc"}],"frontMatter":{"title":"Introducing PostgreSQL as a Data Warehouse Option","slug":"introducing-postgresql-data-warehouse","authors":["hien-vu-ngoc"],"tags":["postgresql","data-warehouse","release","bucketeer-lite"],"hide_table_of_contents":false,"date":"2026-03-05T12:00","description":"Bucketeer supports PostgreSQL as a data warehouse option alongside BigQuery and MySQL, with TimescaleDB available for OLAP workloads.","image":"/img/bucketeer-ogp-logo.png"},"unlisted":false,"prevItem":{"title":"Introducing the Insights Dashboard \u2013 Visibility into Your Feature Flag Usage","permalink":"/blog/introducing-insights-dashboard"},"nextItem":{"title":"The Practical Value of OpenFeature in the AI Product Era","permalink":"/blog/the-practical-value-of-openfeature-in-the-ai-product-era"}}')}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.