Abhishek Roka
Abhishek Roka

Designing the MVP Database for My Placement Portal with Django


While building my Placement Portal, I reached a point where I had to stop adding features and answer a more important question:

What is the smallest version of this product that still delivers value?

Instead of trying to build every feature at once, I decided to define a clear Minimum Viable Product (MVP).

The goal is to build a working recruitment workflow before expanding the platform.

Defining the MVP

For the first release, I limited the portal to four essential capabilities:

Everything else can be built on top of these core workflows.

Designing the Database

With the MVP finalized, I started designing the relational models in Django.

The first set of models includes:

These models form the foundation of the recruitment workflow.

Organizing Students by Batch

Every student belongs to a batch.

A batch is linked to a specific course and contains:

For example:

B.Tech Computer Science – 2026–2030

Instead of allowing administrators to manually enter batch names, I generate a unique batch name by combining:

This creates consistent and predictable batch identifiers across the system.

Company Profiles

Only users with the Company role can create company profiles.

Each company profile stores recruitment-related information such as:

This separates authentication data from business information while keeping the system modular.

Job Posting Workflow

Once a company profile exists, recruiters can publish job opportunities.

Each job post contains information such as:

Instead of making every job visible to every student, eligibility is determined by the selected batches.

This keeps the recruitment process relevant for both students and recruiters.

Batch-Based Eligibility

One design decision I particularly liked was using Batch as the bridge between students and job posts.

When a recruiter publishes a job, they simply select the eligible batches.

A student will only see the job if their batch matches one of the eligible batches.

This approach keeps the filtering logic simple while making it easy to support campus-specific hiring requirements.

Choosing Django's on_delete Behavior

Another decision involved selecting the appropriate on_delete strategy for model relationships.

Django provides several options, including:

During the MVP phase, I decided to use CASCADE for most relationships.

The reason is practical rather than architectural.

While the database schema is still evolving, CASCADE makes it easier to modify or rebuild models without manually cleaning dependent records.

As the project matures, I may replace some relationships with stricter deletion rules where preserving historical data becomes more important.

Tracking Record History

Every model also includes:

These timestamps help answer simple but important questions:

Audit information like this becomes increasingly valuable as the application grows.

Improving the Django Admin

Alongside the models, I also started improving the Django Admin interface.

For the MVP, I focused on:

Although these improvements are small, they significantly improve the administrator's experience while testing and managing the application.

What's Next?

With the core database structure in place, the next milestone is implementing:

Every feature from this point forward will build upon the relational models designed during this phase.

Final Thoughts

One lesson I've learned while building this Placement Portal is that a well-designed database is more valuable than quickly adding features.

A strong data model makes future development easier, keeps business logic simple, and allows the application to scale without constant redesign.

I'm documenting every major architectural decision while building this Placement Portal in public.