DEV Community

Govtpvt
Govtpvt

Posted on

Modelling India's PSU List as Structured Data: A Small Schema

While building the PSU section on Govtpvt, we needed a clean way to store India's public sector companies so the same data could drive tables, filters and per-company pages. Here is the schema we settled on, in case it helps anyone working with Indian government data.

The problem

A "PSU list" looks simple until you try to store it. Companies change status (Miniratna to Navratna to Maharatna), merge, get renamed or move ministries. Public sector banks and insurers are government companies but follow different rules from industrial CPSEs. And recruitment details (GATE or own exam) matter more to readers than the status itself.

The schema

{
  "name": "NTPC Limited",
  "short_name": "NTPC",
  "status": "maharatna",
  "status_since": "2010",
  "type": "cpse",
  "sector": "power",
  "ministry": "Ministry of Power",
  "listed": true,
  "hq": "New Delhi",
  "recruitment": ["gate", "apprenticeship"],
  "careers_url": "https://careers.ntpc.co.in"
}
Enter fullscreen mode Exit fullscreen mode

A few choices worth explaining:

  • status is an enum (maharatna, navratna, miniratna_1, miniratna_2, none) plus status_since, so upgrades are easy to track.
  • type separates cpse, state_psu, psb (public sector bank) and insurer. Mixing them in one flat list confuses readers.
  • recruitment is an array because many companies use more than one route.
  • careers_url always points at the official site. We never link to third-party mirrors for application forms.

Rendering

Grouping by status gives the Maharatna/Navratna/Miniratna tables, and grouping by sector gives the sector-wise view. Filtering recruitment on gate produces the "PSUs that recruit through GATE" list automatically.

You can see the result on the PSU list in India page. The same approach powers our latest government jobs listings, where every entry links back to the official notice.

If you maintain similar datasets for Indian public data, I'd love to compare notes in the comments.

Top comments (0)