Skip to content
Muhammet Şafak
tr
Asked by: Halil Answered:

Should I choose NoSQL or PostgreSQL for flexible product attributes?


Question

On a new project we'll design a flexible product attribute system (color, size, warranty period, etc. — different for every product). In a relational DB the EAV model brings complex SQL and performance loss; NoSQL (MongoDB) looks attractive with its schemaless structure. Given the ACID requirement, data consistency, and reporting needs, by what parameters should I choose between these two worlds?

Answer

Short answer: don’t reach for MongoDB just because attributes vary from product to product — that’s exactly the NoSQL trap. PostgreSQL’s JSONB gives you a third, more accurate option.

The pain is real: EAV (entity-attribute-value) in a relational DB genuinely hurts — huge joins, unreadable SQL, performance loss. But that pain shouldn’t push you straight into schemalessness.

  1. Keep the relational core. Products, prices, orders, stock — everything where you want ACID, joins, and reporting stays relational. This is the spine of your business; you don’t want to give up transactional guarantees, foreign keys, and JOIN-based reports here.
  2. Put the variable attributes in JSONB. Hold the fields that vary per product — color/size/warranty — in a single JSONB column. Add a GIN index on it; queries like attributes @> '{"color":"red"}' run fast. You get schema flexibility where you need it and transactional integrity everywhere else.
  3. Pick document NoSQL only if the whole domain is document-shaped. Moving to MongoDB makes sense only when all access is key-based, you don’t need cross-entity transactions/reporting, and the entire domain is genuinely document-shaped. Your scenario isn’t that.
  4. Your reporting need alone decides it. You say you need heavy reporting. If you split data into Mongo you can’t do those reports in SQL and you’re stuck stitching data from two systems. That single requirement is enough to argue against splitting.

Bottom line: PostgreSQL + JSONB (GIN-indexed) for the variant attributes. Consider NoSQL only if the access pattern truly demands it. Starting with “it has no schema, this’ll be easy” makes you pay a much heavier consistency-and-reporting bill later — I unpack why this architectural choice is a trap in the sade.dev piece.

Related Reading

Tags: #data#architecture#postgresql
Share:

Comments

Sign in with your GitHub account to join the discussion. Comments are stored in GitHub Discussions.

More Questions

All questions

Search the site

Start typing to search posts, projects and pages.

Esc to close Powered by Pagefind