employment
Job Board
Which jobs are open right now?
Post jobs, take applications and list open roles, newest first.
Companies, job postings, applicants, applications and saved jobs share one table. Only open jobs carry the keys for the GSI1 index, so querying it lists live jobs, and filling a job removes it from the index without deleting the posting. FeaturedIndex does the same for featured jobs.
The model
Company
An employer who posts job listings
- pk
- COMPANY#<companyId>
- sk
- COMPANY#<companyId>
Attributes: PK (S), SK (S), companyId (S), name (S), industry (S), size (S), website (S), logoUrl (S), description (S), headquarters (S), foundedYear (N), createdAt (S)
JobPosting
A job listing posted by a company
- pk
- COMPANY#<companyId>
- sk
- JOB#<jobId>
Attributes: PK (S), SK (S), GSI1PK (S), GSI1SK (S), GSI2PK (S), GSI2SK (S), FeaturedPK (S), FeaturedSK (S), jobId (S), companyId (S), companyName (S), title (S), description (S), requirements (L), location (S), remoteType (S), employmentType (S), salaryMin (N), salaryMax (N), salaryCurrency (S), status (S), isFeatured (BOOL), applicationCount (N), postedAt (S), expiresAt (S), createdAt (S)
Applicant
A job seeker who can apply to positions
- pk
- APPLICANT#<applicantId>
- sk
- APPLICANT#<applicantId>
Attributes: PK (S), SK (S), applicantId (S), firstName (S), lastName (S), email (S), phone (S), resumeUrl (S), linkedinUrl (S), currentTitle (S), yearsExperience (N), skills (SS), preferredLocations (SS), createdAt (S)
Application
An applicant's submission to a job posting
- pk
- JOB#<jobId>
- sk
- APP#<applicantId>
Attributes: PK (S), SK (S), GSI3PK (S), GSI3SK (S), applicationId (S), jobId (S), applicantId (S), jobTitle (S), companyName (S), status (S), coverLetter (S), customResumeUrl (S), notes (S), appliedAt (S), updatedAt (S)
SavedJob
A job saved/bookmarked by an applicant
- pk
- APPLICANT#<applicantId>
- sk
- SAVED#<jobId>
Attributes: PK (S), SK (S), applicantId (S), jobId (S), jobTitle (S), companyName (S), savedAt (S)
FeaturedSection
Singleton item for curated homepage featured jobs
- pk
- FEATURED
- sk
- FEATURED
Attributes: PK (S), SK (S), title (S), description (S), jobIds (L), updatedAt (S)
Access patterns
- QueryGet company's job postings
List all job postings for a specific company
- Query · GSI1Browse active jobs
List active job postings sorted by posting date (most recent first)
- Query · GSI2Filter jobs by location and salary
Find jobs in a specific city with salary filtering
- Query · GSI3Get applicant's application history
List all applications submitted by an applicant
- QueryGet all applications for a job
List all applications submitted for a specific job
- Query · FeaturedIndexGet featured job listings
Query the sparse Featured index for premium listings
- UpdateItemMark job as filled
Update job status to filled, which removes it from GSI1 (sparse)
- GetItemGet company details
Fetch one company's profile.
- QueryGet applicant profile
Fetch one applicant's profile, without the jobs they have saved.
- QueryGet applicant's saved jobs
List the jobs an applicant has bookmarked.
- QueryGet featured section content
Read the curated featured section the homepage renders.
Design notes
Sparse index for active jobswhy
GSI1 only contains active jobs. When a job is filled or expired, removing GSI1PK and GSI1SK removes it from the index. No delete needed - just an UpdateItem removing those attributes.
Featured index is sparsewhy
Only jobs with isFeatured=true have the FeaturedPK/FeaturedSK attributes. This keeps the index small and fast for homepage queries. INCLUDE projection minimises storage.
Denormalised company and job infotrade-off
Application items include jobTitle and companyName to display application history without additional lookups. If company renames, historical applications show old name (usually desired behaviour).
Salary in GSI2 sort keygotcha
Storing salary as GSI2SK enables range queries (>= minSalary). Zero-padded for correct string sorting: "SALARY#0000120000". Alternative: use Number type but requires careful padding.
Singleton for featured sectionalternative
FeaturedSection is a singleton item (PK=SK="FEATURED") storing curated job IDs. Alternative would be tagging jobs as featured and querying, but singleton gives explicit control over order.
A filled job leaves the indextrade-off
Mark job as filled sets job-002's status to filled and removes GSI1PK and GSI1SK, on condition that it is still active, so Browse active jobs returns one posting fewer afterwards. Run it again and it is refused, because the job is no longer active.
Taught in the course
- The key is the address - GetItem needs the whole primary key: partition and sort.
- The sort key is a query language - Conditions on the sort key narrow a Query before it reads, for free.
- Model a one-to-many with one partition - A parent and its children share a partition key, so one Query fetches them together.
- Absence as a filter - An item appears in an index only if it has the index's key, so leaving the key off filters it out.
List all job postings for a specific company
Choose an access pattern above, or build your own request. See what comes back and what it costs.
Write transactions, streams, tags and TTL are among the operations this browser build leaves out. dynoxide's native build has them.