10 ms·
How to use Postgres for everything
- rcleveng 2y agoI like this. I strongly believe that picking some tech stack you know when you are starting out is always the right decision, until it's not. Only then do you pick a different solution. Better to move fast leveraging what you know, until you need something else.
- adamcharnock 2y agoIf anyone has seen a steams implementation in Postgres please let me know. Not just pub/sub, but full implementation of streams with consumer groups would be very interesting to me. Second best, how would you implement this in Postgres? I’m tempted to give it a go but I haven’t a fully-baked plan yet.
- boomskats 2y agoHave a look at diogob/postgres-websockets or supabase/realtime.
- foobarkey 2y ago[flagged]
- MonkeyClub 2y agoObjection, asked and answered: https://m.youtube.com/playlist?list=PLBrWqg4Ny6vVwwrxjgEtJgdreMVbWkBz0 https://m.youtube.com/playlist?list=PLBrWqg4Ny6vVwwrxjgEtJgd...
- whateveracct 2y agoJust don't use a single Postgres DB for everything as you scale up to 100+ engineers. You'll inevitably get database-as-the-API. Now if you have the actual technical leadership [1] to scale your systems by drawing logical and physical boundaries so that each unit has its own Postgres? Yeah Postgres for everything is solid. [1] Surprisingly rare I've found. Lots of "successful" CTOs who don't do this hard part.
- RedShift1 2y ago> You'll inevitably get database-as-the-API I think that's actually the point of "postgres for everything"?
- whateveracct 2y agoIf you don't have any discipline it becomes hell. Not to mention that a random team writing a migration that locks a key shared table (or otherwise chokes resources) now causes outages for everyone.
- blackenedgem 2y agoRight but in this "100-engineer" scenario you'd have hoped the following would have happened: - Docs and guidelines on migrations would have been written - Some level of approval and review is required before execution These are things that isn't really postgres specific, any company that doesn't have those is going to be a nightmare.
- robertlagrant 2y agoIf teams have technical boundaries defined at a higher level in the stack (e.g. APIs) and so they don't share a database, you don't need loads of process and docs and architectural meetings to coordinate. Letting teams delivery independently is a good architectural feature.
- ForHackernews 2y agoThis is why everyone adopted "microservices" - it's Conway's law in action, a technical intervention for an organizational problem.
- whateveracct 2y agoEven with those things, blast radius for mistakes is ..the entire company is down. e.g. User management deploy has somehow taken down core payment processing.
- KingOfCoders 2y ago"It's inspired by this article from the Amazing CTO [0]" Getting up in the morning, seeing an article that references you, bliss! [0]: https://www.amazingcto.com/postgres-for-everything/ https://www.amazingcto.com/postgres-for-everything/
- tbarbugli 2y ago> Use Postgres for Fulltext Search instead of Elastic pg fulltext search is very limited and user unfriendly, not a great suggestion here
- 29athrowaway 2y agoBroken markdown. - the entire repository is 1 file - the file is titled "read me" - but you didn't read it (it's not proofread) why do you want me to read something you did not read?
- feverzsj 2y agoPostgres administration is such a PITA. I'd rather use sqlite for everything.
- cpursley 2y agosqlite is neat but most of us need a real database with enterprise features
- lokimedes 2y agoHaving just spent the better part of two weeks integrating Apache Age for Graph data, just to realize the project is stale and a mess, don’t take this list on face value. Now hoping for better results with DGraph, but it seems that graph databases are living a precarious existence.
- anon3459 2y agoHaaaa same here for apache age. Can you elaborate a little please
- lokimedes 2y agoThe original sponsor of the project just withdrew all resources, the state of the existing codebase is far from mature, the client I tried (python) was really shaky and the lidt goes on. As for the precarious life of graph database companies. DGraph also went though being sold recently, and OrientDB that I also liked, as acquired by SAP, only to be abandoned. Neo4j has stood its time, but the licensing doesn’t fit our needs.
- worldsayshi 2y agoI wonder what's the catch with Dgraph? Why not chose it above Neo4j? I'm asking because the graph db projects I've been involved in has all used Neo4j and it would be nice to know of a good alternative.
- lokimedes 2y agoI want it to be as free as possible, neo4j only let’s you run a single database in non-Enterprise mode. We are building a consumer product, where the database is embedded and not centralized in a cloud, so my focus is perhaps different from most. Both neo4j and dgraph comes with additional non-compete clauses, but DGraph’s work for our use case. Subjectively I’d prefer neo4j. I have been following the company since its inception.
- jensneuse 2y agoI absolutely love Postgres, but please allow me to say that you absolutely don't want to expose an API generated from a database to people outside of your team. This limits you a lot in changing the way you store your data. I wrote about this topic before and haven't changed my opinion much. You don't want to have that tight coupling: https://wundergraph.com/blog/six-year-graphql-recap#generated-graphql-apis:-tight-coupling-as-a-service https://wundergraph.com/blog/six-year-graphql-recap#generate...
- dunwaldo 2y agoyou could use views as a layer in between?
- boomskats 2y agoYou should use views as the layer in between. They'll let you version your API and make changes without breaking things.
- RedShift1 2y agoWhat exactly is the problem with tight coupling? You're going to insert an entire layer that basically translates format A to format B, just so you can later change a column name in the database and not have to change it in the API or something?
- haileys 2y agoYes. A lot of the work I've done through my career is essentially this, once you boil away the rest of the details.
- deleted 2y ago[deleted]
- grey-area 2y ago1. You don’t want or need to expose lots of implementation details. Many of your data structures should be private, and many should be partly private. 2. Your data structures should not dictate the shape of your api, usage patterns should (e.g. the user always needs records a,b,c together or they have a and want c but don’t care about b) 3. It stops you changing any implementation details later and/or means any change is definitely a breaking change for someone.
- cynicalsecurity 2y agoPostgres cult strikes back.
- anonzzzies 2y agoIs there a local-first postgres solution?
- malux85 2y agoWhat do you mean local first? Postgres is an executable that you can run on your machine if you wish
- anonzzzies 2y agoI mean storing data in your https://localfirstweb.dev https://localfirstweb.dev . Sqlite allows that so you can work fully in our client (browser/mobile) without internet potentially and then later sync (rqlite, pouchdb, etc for instance). If I get to do 'everything' with postgres, I need that too, so I was wondering if it exists.
- paulgb 2y agohttps://electric-sql.com/ https://electric-sql.com/ does this, running a stripped-down version of postgres on the client. https://www.powersync.com/ https://www.powersync.com/ is a similar approach, but using sqlite on the client. https://zero.rocicorp.dev/ https://zero.rocicorp.dev/ also deserves a mention, but I believe it’s more of a read cache with writes going directly to the server. I’m not sure if it supports SQL client-side or has its own ORM.
- jascha_eng 2y agoThe markdown is a bit broken. But I agree with the message. Created a PR to update some of the vectordb links and also fixed the markdown: https://github.com/Olshansk/postgres_for_everything/pull/1 https://github.com/Olshansk/postgres_for_everything/pull/1
- rozenmd 2y agoI've been running my project as a business for almost four years now and I think my Postgres DB is the only thing that I haven't changed. Easily the most stable part of the stack (100% uptime on RDS since 2021/02/01).
- joeevans1000 2y agoGreat repo! Thanks! I'm wondering, any approach for bitemporal dbs, like xtdb?
- seanhunter 2y agoYou definitely don’t need a special database for bitemporal data. Just a datetime and as of data time column, your value column and whatever metadata you want (or a jsonb col for metadata if you want more flexibility at the cost of some speed of filtering by metadata)
- refset 2y agoHow do you find it when you scale it up to every table, every query?
- seanhunter 2y agoI’m not 100% sure what you mean. Systems I have used that do this don’t generally store each time series in a different table. Normally there’s just one big table for intraday time series and one for daily, with columns being like ts, as_of, series_id, value, metadata or something like that. It scales just fine depending of course on the usual stuff - load pattern etc. If you want really high scalability you should be using something like clickhouse anyway. Edit to add: the rationale behind having separate intraday and daily time series tables in those systems is the type of the value and as of timestamps is different (in one its a date, in one its a datetime), and storing dates as datetimes is a rich source of bugs.
- refset 2y agoI meant 'scale' mostly in the sense of 'complexity' (sorry!). If you only have a small number of tables you need/want this versioning for then the DIY approach is workable, but if you want to apply this across an entire schema then things can get complicated fast.
- 2y ago
- ianpurton 2y agoI can see a lot of benefits of having 1 API to access a lot of functionality. For example instead of integrating with a message queue I can just do an INSERT this is great. It lowers the friction. Vector search is a no brainer too. Why would I have 2 databases when 1 can do it all. Using Postgres to generate HTML is questionable though. I haven't tried it but I can't image its a viable way to create user interfaces.
- qpiox 2y ago> Using Postgres to generate HTML is questionable though. I haven't tried it but I can't image its a viable way to create user interfaces. Check https://apex.oracle.com/ https://apex.oracle.com/ which does that.
- wiseowise 2y agos/postgres/sqlite/g
- jankovicsandras 2y agoCan you please add this shameless plug? https://github.com/jankovicsandras/plpgsql_bm25 https://github.com/jankovicsandras/plpgsql_bm25 Opensource BM25 search in PL/pgSQL (for example where you can't use Rust extensions), and hybrid search with pgvector and Reciprocal Rank Fusion.
- deleted 2y ago[deleted]
- cvalka 2y ago[flagged]
- matthewmacleod 2y agoIf you’re going to make a ragebait comment you should ideally provide some kind of basis beyond “waaaah everybody except me is stupid”
- cvalka 2y agoYou should find your reading glasses and read what actually is written. When you do find your reading glasses, the links below might be helpful. https://en.wikipedia.org/wiki/TiDB https://en.wikipedia.org/wiki/TiDB https://en.wikipedia.org/wiki/YugabyteDB https://en.wikipedia.org/wiki/YugabyteDB https://ydb.tech/ https://ydb.tech/
- boomskats 2y agohttps://db-engines.com/en/ranking_trend/relational+dbms https://db-engines.com/en/ranking_trend/relational+dbms
- cvalka 2y agohttps://en.wikipedia.org/wiki/TiDB https://en.wikipedia.org/wiki/TiDB https://en.wikipedia.org/wiki/YugabyteDB https://en.wikipedia.org/wiki/YugabyteDB https://ydb.tech/ https://ydb.tech/
- cpursley 2y agoOkay, so please enlighten us, then. Which extendable open source modern database is the new hotness?
- paradite 2y agoAnyone experienced with postgres full text search? I want to get something simple setup but couldn't get it to work. I want to match substrings like "/r/chatgpt" (sub reddits) in url links, but couldn't get it to match. Tried a few types of queries like phrase, plain, default, simple, english. All have some weird issues, either not matching special characters, or not matching substrings (partial match). Also I'm somewhat limited on the syntax side by what can be done with drizzle ORM.
- jumping_frog 2y ago> I want to match substrings like "/r/chatgpt" (sub reddits) in url links, but couldn't get it to match. This likely means tokenization striping out special characters. Try ngram search methods. They should work out of box.
- lenkite 2y agoWonder if someone can write a SQLite for everything article too - would be far more difficult though if considering HA.
- cpursley 2y agoThanks for the gist mention!: https://gist.github.com/cpursley/c8fb81fe8a7e5df038158bdfe0f06dbb https://gist.github.com/cpursley/c8fb81fe8a7e5df038158bdfe0f...
- j12a 2y agoBeing stuck with MariaDB/MySQL in some projects, I recently compared it to PostgreSQL and found many of these extended capabilities existing there also, including JSON, temporal tables (w/ SYSTEM VERSIONING), columnar and vector storages etc. LISTEN/NOTIFY type functionality was sort of missing but otherwise it was surprising how it is keeping up also, while little of that is probably being used by many legacy apps.
- bkovacev 2y agoWhile we are it - are there any good resources on how to best self host a Postgres database? Any tips and tricks, best practices, docker / no docker etc? I’m looking to self host a database server for my multiple pet projects, but I would love to get backups, optimizations and other stuff done well.
- philippta 2y agoI find this YouTube channel[0] has a great number of videos on how to setup Postgres on a regular Linux machine, explaining how configure it and make it work for high availability. It’s easier than you’d think. [0] https://youtube.com/playlist?list=PLBrWqg4Ny6vVwwrxjgEtJgdreMVbWkBz0&si=AwD7Ng8wzFuJTCVg https://youtube.com/playlist?list=PLBrWqg4Ny6vVwwrxjgEtJgdre...
- Toritori12 2y agoafaik: On promise: Use containers but the data folder should be mounted volume On cloud/k8s: Just use a managed DB, setting up a DB in k8s is hard because the filesystem
- hboon 2y agoNot the answer you were looking for, but I had been shopping recently for slightly overlapping reasons (I want to ship projects, but they are all smaller MVPs that might run for a while and I didn't want to pay for 1 database service for each one on Render). I found https://www.thenile.dev/pricing https://www.thenile.dev/pricing which supports which apparently supports unlimited databases.
- christophilus 2y agoWhen I self host I lean towards SQLite simply because it’s simpler. In-place upgrades, trivial backups via Litestream, etc. Postgres major version upgrades are the main reason I don’t self host it, though maybe I should rethink my position on that!
- moehm 2y agoFor backups, pg_dump is good and simple for starting out. For tuning, postgresqlco.nf[1] is great. [1] https://postgresqlco.nf/tuning-guide https://postgresqlco.nf/tuning-guide
- deleted 2y ago[deleted]
- jeeybee 2y agoPGQueuer is a lightweight job queue for Python, built entirely on PostgreSQL. It uses SKIP LOCKED for efficient and safe job processing, with a minimalist design that keeps things simple and performant. If you’re already using Postgres and want a Python-native way to manage background jobs without adding extra infrastructure, PGQueuer might be worth a look: GitHub - https://github.com/janbjorge/pgqueuer https://github.com/janbjorge/pgqueuer
- WJW 2y agoI always wondered about the claim that SKIP LOCKED is all that efficient. Surely there are lots of cases where this is a really suboptimal pattern. Simple example: if you have a mixture of very short jobs and longer duration jobs, then there might be hundreds or thousands of short jobs executed for each longer job. In such a case the rows in the jobs table for the longer jobs will be skipped over hundreds of times. The more long-running jobs running concurrently, the more wasted work as locked rows get skipped again and again. It wouldn't be a huge issue if load is low, but surely a case where rows get moved to a separate "running" table would be more efficient. I can think of several other scenarios where SKIP LOCKED would lead to lots of wasted work.
- cercaapps 2y agoJob rows could have an indexed column state so you just query for the rows with state "not-started". This way you won't need to skip over the long jobs that are in state "processing".
- normie3000 2y agoI'm not 100% confident, but this sounds like it would have unexpected effects.
- jeeybee 2y agoGood point about SKIP LOCKED inefficiencies with mixed-duration jobs. In PGQueuers benchmarks, throughput reached up to 18k jobs/sec, showing it can handle high concurrency well. For mixed workloads, strategies like batching or partitioning by job type can help. While a separate "running" table reduces skips, it adds complexity. SKIP LOCKED strikes a good balance for simplicity and performance in many use cases. One known issue is that vacuum will become an issue if the load is persistent for longer periods leading to bloat.
- polote 2y agoThis idea that Postgres should be used for everything really need to die in a professional context. I was appointed in a company of 10 dev that did just that. All backend code was PostgreSQL functions, event queue was using Postgres, security was done with rls, frontend was using posgtraphile using graphql to expose these functions, triggers were being used to validate information on insert/update. It was a mess. Postgres is a wonderful database, use it as a database. But don't do anything else with it. Before some people come and say "things were not done the right way, people didn't know what they were doing". The dev were all fan of Postgres contributing to the projects around, there was a big review culture so people were really trying to the best. The queue system was locking all the time between concurrent requests => so queue system with postgres works for a pet project All the requests were 3 or 4 times longer due to fact that you have to check the rls on each row. We have also all pour API migrated now and each time the sql duration decrease by that factor ( and it is the exact same sql request ). And the db was locking all the time because of that as it feels likes rls breaks the deadlock detection Postgres algorithm SQL is super verbose a language, you spend your time repeating the same line of code , it makes basic function about 100 lines long when they are 4-5 lines in nodes js It is impossible to log things inside these functions to have to make sure things will work and if it doesn't you have no way to know where the code did go through You can't make external API call, so you have to use a queue system to make any basic things there There are not real lib , so everything need to be reimplemeted It is absolutely not performant to code inside the db, you can't do a map so you O(n2) code all the time API were needed for the external world , so there was actually another service in front of the database for some case and a lot of logic were reimplemeted inside it There was a downtime at each deployment as we had to remove all the rls and recreate them ( despite the fact that all code was in insert if not update clauses) it worked at the beginning but at some point in time it stopped working and there was no way to find why, so drop all rls and recreate them It is impossible to hire dev that wants to work on that stack and be business oriented , you would attract only purely tech people that care only about doing there own technical stuff We are almost out of it now after 1 year of migration work and I don't see anything positive about this Postgres do everything culture compared to a regular node js + Postgres as a database + sqs stack So to conclude, as a pet project it can be great to use Postgres like that, in a professional context you are going to kill the company with this technical choice
- maxboone 2y agoOne of the problems I have with this is that I wonder if this doesn't majorly impact blue/green upgrades and (actual cluster, not schema) migrations.
- cbeach 2y agoI love Postgres but wouldn't want to use it for everyting. Taking graph databases, for example, Postgres (via Apache AGE) stores graph data in relational tables with O(log(n)) index lookups and O(k ⋅ log(n)) traversal* Whereas a true graph database like Neo4J stores graph data in adjacency lists, which means O(1) index lookups and O() traversal. That's a massive difference in traversal complexity for most graphs. *k is the degree of the node (number of edges connected to a node).
- cbeach 2y agoTypo: Neo4j: O(k) traversal
- mkaski 2y agoGlad to see pg_render on the list! Here's a demo site rendered entirely using just Postgres(t): https://pgrender.org https://pgrender.org
- pdimitar 2y agoFrustratingly, all the demos are blank canvases for me. I use PiHole at home but I checked the query logs and I see no blocking anywhere. Enabled all JS via uMatrix and uBlock Origin but still no dice. macOS, Safari and Firefox.
- tlarkworthy 2y agoI was recently annoyed to find postgres indexes don't support skipping [1] you also can't have the nul character in a string (\u0000) [2]. Its great, but it has some strange WTF gaps in places. [1] https://wiki.postgresql.org/wiki/Loose_indexscan https://wiki.postgresql.org/wiki/Loose_indexscan [2] https://stackoverflow.com/questions/28813409/are-null-bytes-allowed-in-unicode-strings-in-postgresql-via-python https://stackoverflow.com/questions/28813409/are-null-bytes-...
- hamilyon2 2y agoYes, skip-index scans require custom sql now. I am also a bit annoyed by cache-like uses not being first-class. Unlogged tables get you far, temporary tables are nice, but still all this feels like a hurdle, awkward and not what you actually need.
- drtgh 2y ago> I am also a bit annoyed by cache-like uses not being first-class. Since what happened recently with Redis[1] the first thing I thought about was Postgre, but the performance[2] difference is too noticeable, so one have to look for other alternatives, and not very confident due thinking such alternatives may follow the same "Redi's attitude" ( ValKey, DragonflyDB, KeyDB, Kvrocks, MinIO, RabbitMQ, etc etc^2 ). It would be nice if these cache-like uses within Postgre had a tinny push. [1] https://news.ycombinator.com/item?id=42239607 https://news.ycombinator.com/item?id=42239607 [2] https://medium.com/redis-with-raphael-de-lio/can-postgres-replace-redis-as-a-cache-f6cba13386dc https://medium.com/redis-with-raphael-de-lio/can-postgres-re... XXXXX achieves a latency of 0.095 ms, which is approximately 85% faster than the 0.679 ms latency observed for Postgres’ unlogged table. It also handles a much higher request rate, with 892.857,12 requests per second compared to Postgres’ 15.946,02 transactions per second.
- RedShift1 2y agoWhat is a reasonable use for a null character in a string? My first instinct is that strings with nulls in them should absolutely be rejected.
- rdsubhas 2y agoThis is a lovely list, thank you. But what's really missing is multi master and high availability. I'm glad to see that partitioning via sharding is covered. IMHO the true limitations of RDBMS are not about usage, but scaling: Multi master across simple zones, High availability, Partitioning. (IMHO it comes from ACID compliance, so I don't know if it's even solveable natively)
- christophilus 2y agoHas anyone here run Firebird in production? It seems simpler (from an ops / sysadmin point of view).
- ksynwa 2y agoAnyone has advice for backup up a postgres database that is run for personal use? I currently have one that is used by miniflux. I wrote a script for backing it up but it is gonna fail me some day. ``` #!/usr/bin/env sh set -e PGUSER=miniflux PGPASSWORD=... pg_dump -F t -h 127.0.0.1 miniflux | gzip > /backups/miniflux_db_temp.tar.gz mv /backups/miniflux_db{_temp,}.tar.gz ```
- supriyo-biswas 2y agoThat works but for a more robust solution you could look at https://pgbackrest.org https://pgbackrest.org
- sureglymop 2y agoI do something similar but pipe a dump of the whole db with pg_dump into restic. Only works well for small to medium sized DBs.
- Jeffpk11 2y ago[dead]
- tanin 2y agoGreat repo. I love Postgres too. Use it for everything until there's an actual bottleneck
- dmezzetti 2y agoI fully agree. Postgres has solved many of the problems that many are re-solving with GenAI related databases. With txtai (https://github.com/neuml/txtai https://github.com/neuml/txtai), I've went all in with Postgres + pgvector. Projects can start small with a SQLite backend then switch the persistence to Postgres. With this, you get all the years of battle-tested production experience from Postgres built-in for free.
- osigurdson 2y agoPostgres, ClickHouse and NATS for everything
- pdimitar 2y agoYou use NATS as opposed to Kafka, I presume? Also, what's Clickhouse for? Logs, observability data?
- osigurdson 2y agoNATS is great because it has pub/sub, streaming (like Kafka), KVS (like Redis). It is possible to do some of these things in Postgres but really, why? We use ClickHouse for time series data. Postgres was ok up to low billions of points. Despite trying to use timescale for this purpose it did not fit our use case.
- pdimitar 2y agoVery valuable, thank you. As time series data (and especially observability data) tends to very quickly explode in volume, I believe planning for tens of billions, if not trillions, of records is worth planning for from the start and it is not over-engineering. If you don't mind one final question: can you ACK a message in NATS without it being bound to offset that makes it impossible to _not_ ACK a message without ruining the ACKs of the previous messages? To clarify: I often found myself in situations when I was fetching batches of stuff from Kafka, say, 50 at a time, and then hand them off to 50 parallel agents to process. However, f.ex. messages 17, 31 and 47 failed processing and I could not not ACK them as that would not allow us to ACK those that succeeded before. So I ended up pushing them to another Kafka queue / topic that specifically deals with retries. That's IMO a hack, as most apps out there surely don't need the monstrous speed that Kafka can provide. I am OK with something (not much) slower where I have the freedom to ACK or not-ACK any particular event/message regardless of its position. Does NATS allow for it?
- osigurdson 2y agoPerhaps I misunderstand, but if you have 50 parallel agents, why not just have each pull messages, process them and ACK when complete? The part I don't understand is the pre-fetch. Note that NATS is much more flexible than Kafka however, so more likely to fit more uses cases (even just for streaming). For the first question, I'd definitely recommend using ClickHouse for 10B - 1T points.
- Havoc 2y agoWhile I appreciate postgres flexibility this feels like a mistake. A bit like a person insisting Rust is best and using other languages are unnecessary. You could, but it is going to force technical compromises. Even tools that can do everything aren't the best at everything.
- deleted 2y ago[deleted]
- Ambolia 2y agoWhat about binary blobs? I hate having to store them outside of the database and that you can't just do a dbdump/import to clone a project.
- taffer 2y agoHave you had a look at the bytea[1] type? It allows you to store binary objects up to 1GB and it's dumped transparently just like a string. [1] https://www.postgresql.org/docs/current/datatype-binary.html https://www.postgresql.org/docs/current/datatype-binary.html
- saisrirampur 2y agoTL;DR from many comments: just don’t do it! I’m glad this is becoming mainstream, and people are realizing that Postgres for everything doesn’t work. Don’t get me wrong—I’m a huge Postgres proponent and have spent 10 years helping customers implement it. However, I’m a strong believer in using Postgres for what it’s designed for in first-place. Postgres was designed as a row-based OLTP database, with over 30 years of effort dedicated to making it robust for that use case.I know there are many extensions attempting to make Postgres support other use cases, such as analytics, queues, and more. Keep in mind that these extensions are relatively recent and aim to retrofit new capabilities onto a database primarily designed for transactional workloads. It’s like adding an F1 car engine to a Toyota Camry — will that work? Extensions also have many issues—they are not fully Postgres-compatible. In Citus, for example, we added support for the COPY command four years into the company, and chasing SQL coverage was a daily challenge for 10 years. Being unable to use the full capabilities of Postgres and having to work around numerous unsupported features defeats the purpose of being a Postgres extension. On the other hand, you have purpose-built alternatives like ClickHouse and Snowflake for analytics, Redis for caching, and Kafka for queues. These technologies have benefited from decades of development, laser-focused on supporting specific use cases. As a result, they are robust and highly efficient for their intended purposes. I often hear that these Postgres extensions are expanding the boundaries of what Postgres can do. While I partly agree, I also question the extent to which these boundaries are truly being expanded. In this era of AI, where data is growing exponentially, handling scale is critical for any technology. These boundaries will likely be broken very quickly. Take queues as an example: you have a purpose-built technology like Kafka or a Postgres extension that supports queues. For an early-stage startup, adopting a less optimized Postgres-based solution may (not a guarantee) save a few weeks of initial CapEx costs compared to using an optimized solution like Kafka. However, 6 to 12 months later, you may find yourself back to square one when the Postgres-based queue fails to scale. At that point, migrating to a purpose-built technology becomes an arduous task—your system has grown, and now it may take months of effort and a larger team to make the switch. Ultimately, this approach can cost more time and money than starting with a purpose-built solution from the beginning, which might have only required a few extra weeks of CapEx. I’ve seen this firsthand at Citus, where customers like Cloudflare and Heap eventually migrated to purpose-built databases like ClickHouse and SingleStore respectively. While these migrations happened a few years later, times have changed — data grows faster now, and the need for a purpose-built database arises much sooner. It’s also worth noting that Citus was an incredible piece of technology that required years of development before it could start making a real impact. TL;DR: Please think carefully before choosing the right technology as you scale. Cramming everything into Postgres might not be the best approach for scaling your business.