Database Schema Documentation
This document outlines the database schema for the GoHorseJobs platform.
Entity Relationship Diagram
erDiagram
users {
int id PK
varchar identifier UK
varchar password_hash
varchar role
varchar full_name
varchar language
boolean active
timestamp created_at
timestamp updated_at
timestamp last_login_at
}
companies {
int id PK
varchar name
varchar slug UK
varchar type
varchar document
varchar address
int region_id FK
int city_id FK
varchar phone
varchar email
varchar website
varchar logo_url
text description
boolean active
boolean verified
timestamp created_at
timestamp updated_at
}
jobs {
int id PK
int company_id FK
int created_by FK
varchar title
text description
decimal salary_min
decimal salary_max
varchar salary_type
varchar currency
varchar employment_type
varchar work_mode
varchar working_hours
varchar location
int region_id FK
int city_id FK
jsonb requirements
jsonb benefits
boolean visa_support
varchar language_level
varchar status
boolean is_featured
timestamp created_at
timestamp updated_at
}
applications {
int id PK
int job_id FK
int user_id FK
varchar name
varchar email
varchar phone
varchar line_id
varchar whatsapp
text message
varchar resume_url
jsonb documents
varchar status
text notes
timestamp created_at
timestamp updated_at
}
regions {
int id PK
varchar name
varchar country_code
varchar code
}
cities {
int id PK
int region_id FK
varchar name
}
user_companies {
int id PK
int user_id FK
int company_id FK
varchar role
jsonb permissions
}
favorite_jobs {
int id PK
int user_id FK
int job_id FK
}
users ||--o{ user_companies : "belongs to"
companies ||--o{ user_companies : "has members"
companies ||--o{ jobs : "posts"
users ||--o{ jobs : "creates"
jobs ||--o{ applications : "receives"
users ||--o{ applications : "submits"
regions ||--o{ cities : "contains"
regions ||--o{ companies : "located in"
cities ||--o{ companies : "located in"
regions ||--o{ jobs : "located in"
cities ||--o{ jobs : "located in"
users ||--o{ favorite_jobs : "saves"
jobs ||--o{ favorite_jobs : "saved by"
Core Tables
Users (users)
Represents system users including Candidates, Recruiters, and Admins.
| Column |
Type |
Description |
| id |
INTEGER |
Primary key |
| identifier |
VARCHAR |
Unique, Email or Username |
| password_hash |
VARCHAR |
Bcrypt hash |
| role |
VARCHAR |
superadmin, companyAdmin, recruiter, jobSeeker |
| full_name |
VARCHAR |
Display name |
| language |
VARCHAR |
Default: 'pt' |
| active |
BOOLEAN |
Account status |
| created_at |
TIMESTAMP |
Creation time |
| updated_at |
TIMESTAMP |
Last update |
| last_login_at |
TIMESTAMP |
Last login |
Companies (companies)
Represents employer organizations.
| Column |
Type |
Description |
| id |
INTEGER |
Primary key |
| name |
VARCHAR |
Company name |
| slug |
VARCHAR |
URL-friendly identifier |
| type |
VARCHAR |
Company type |
| document |
VARCHAR |
Houjin Bangou / CNPJ |
| address |
VARCHAR |
Physical address |
| region_id |
INTEGER |
FK → regions.id |
| city_id |
INTEGER |
FK → cities.id |
| phone, email, website |
VARCHAR |
Contact info |
| logo_url |
VARCHAR |
Logo image URL |
| description |
TEXT |
Company description |
| active |
BOOLEAN |
Active status |
| verified |
BOOLEAN |
Verification status |
Jobs (jobs)
Represents job postings.
| Column |
Type |
Description |
| id |
INTEGER |
Primary key |
| company_id |
INTEGER |
FK → companies.id |
| created_by |
INTEGER |
FK → users.id |
| title |
VARCHAR |
Job title |
| description |
TEXT |
Full job description |
| salary_min |
DECIMAL |
Minimum salary |
| salary_max |
DECIMAL |
Maximum salary |
| salary_type |
VARCHAR |
hourly, daily, weekly, monthly, yearly |
| currency |
VARCHAR |
BRL, USD, EUR, GBP, JPY |
| employment_type |
VARCHAR |
full-time, part-time, contract, temporary, training, voluntary, permanent, dispatch |
| work_mode |
VARCHAR |
onsite, hybrid, remote |
| working_hours |
VARCHAR |
e.g. "9:00-18:00" |
| location |
VARCHAR |
Location string |
| region_id |
INTEGER |
FK → regions.id |
| city_id |
INTEGER |
FK → cities.id |
| requirements |
JSONB |
Skills/requirements array |
| benefits |
JSONB |
Benefits array |
| visa_support |
BOOLEAN |
Visa sponsorship |
| language_level |
VARCHAR |
N5, N4, N3, N2, N1, beginner, none |
| status |
VARCHAR |
draft, open, closed, published, paused, expired, archived, reported, review |
| is_featured |
BOOLEAN |
Featured job flag |
Applications (applications)
Represents job applications.
| Column |
Type |
Description |
| id |
INTEGER |
Primary key |
| job_id |
INTEGER |
FK → jobs.id |
| user_id |
INTEGER |
FK → users.id (nullable for guests) |
| name |
VARCHAR |
Applicant name |
| email |
VARCHAR |
Contact email |
| phone |
VARCHAR |
Phone number |
| line_id |
VARCHAR |
LINE ID |
| whatsapp |
VARCHAR |
WhatsApp number |
| message |
TEXT |
Cover message |
| resume_url |
VARCHAR |
Resume file URL |
| documents |
JSONB |
Additional documents |
| status |
VARCHAR |
pending, reviewed, shortlisted, rejected, hired |
| notes |
TEXT |
Recruiter notes |
Reference Tables
Regions (regions)
| Column |
Type |
Description |
| id |
INTEGER |
Primary key |
| name |
VARCHAR |
Region name |
| country_code |
VARCHAR |
e.g. "JP", "BR" |
| code |
VARCHAR |
Region code |
Cities (cities)
| Column |
Type |
Description |
| id |
INTEGER |
Primary key |
| region_id |
INTEGER |
FK → regions.id |
| name |
VARCHAR |
City name |
Junction Tables
User Companies (user_companies)
Maps users to companies (N:M relationship).
| Column |
Type |
Description |
| id |
INTEGER |
Primary key |
| user_id |
INTEGER |
FK → users.id |
| company_id |
INTEGER |
FK → companies.id |
| role |
VARCHAR |
companyAdmin, recruiter |
| permissions |
JSONB |
Custom permissions |
Favorite Jobs (favorite_jobs)
| Column |
Type |
Description |
| id |
INTEGER |
Primary key |
| user_id |
INTEGER |
FK → users.id |
| job_id |
INTEGER |
FK → jobs.id |
Audit Tables
Login Audits (login_audits)
| Column |
Type |
Description |
| id |
INTEGER |
Primary key |
| user_id |
VARCHAR |
User identifier |
| identifier |
VARCHAR |
Login identifier used |
| ip_address |
VARCHAR |
Client IP |
| user_agent |
VARCHAR |
Browser/client info |
| created_at |
TIMESTAMP |
Login time |
Password Resets (password_resets)
| Column |
Type |
Description |
| id |
INTEGER |
Primary key |
| user_id |
INTEGER |
FK → users.id |
| token |
VARCHAR |
Reset token |
| expires_at |
TIMESTAMP |
Token expiry |
| used |
BOOLEAN |
Token used status |