Complete visual documentation of current and proposed data structures
The Wix Careers site uses a hybrid data architecture with multiple data sources:
The team mapping system uses THREE separate hierarchies that are connected but independent:
| Sync Job | Frequency | Source | Target | Purpose | Status |
|---|---|---|---|---|---|
syncPostings |
Every 10 minutes | SmartRecruiters API | Postings collection | Keep job listings up-to-date | ✅ Active |
syncCentralDB |
Daily at 11:59 PM | Oracle External DB | ClonedCentralDBOrganization ClonedCentralDBLocations |
Clone Oracle data for reference fields | ⚠️ Active (has bug) |
Location: src/backend/data-sync/centralDBSync.js:48
Issue: For existing items that need updates, the function takes OLD data from CMS instead of FRESH data from Oracle
Current Code:
...a.filter(item => idsInB.has(item._id))
Should Be:
...b.filter(item => idsInA.has(item._id))
Impact: Updates from Oracle are not synced for existing items, only new inserts and deletions work correctly
Both sync jobs use a "delete and recreate" approach rather than comparing field values:
Reasoning: With 10-minute (postings) and daily (oracle) frequencies, and relatively small datasets, the simplicity outweighs optimization benefits. Modern serverless compute handles this efficiently.
Before proposing a MySQL architecture, let's evaluate if it's necessary:
| Issue | Severity | Wix CMS Solution | Requires MySQL? |
|---|---|---|---|
| Unused collections (ClonedCentralDBLocations) | 🟡 Low | Simply stop syncing it | ❌ No |
| Redundant data in Postings (city, country) | 🟡 Low | Keep for filtering performance | ❌ No |
| Complex team mapping | 🟢 Feature | Working as designed | ❌ No |
| Sync bug in centralDBSync | 🔴 High | Fix one line of code | ❌ No |
| Multiple Edit collections for one entity | 🟡 Medium | Consolidate with better UI | ❌ No |
| Oracle ID storage rationale unclear | 🟢 Documentation | Better documentation | ❌ No |
Verdict: MySQL is NOT necessary. The current architecture is sound but needs cleanup and optimization.
Reasons to keep Wix CMS:
| Task | Priority | Effort | Impact | Action |
|---|---|---|---|---|
| Fix syncCentralDB bug | 🔴 Critical | 1 line | High | Change line 48 in centralDBSync.js |
| Remove ClonedCentralDBLocations sync | 🟡 Medium | Low | Low | Stop syncing, keep collection for now |
| Consolidate Edit Collections UI | 🟡 Medium | High | Medium | Build unified editor for team content |
| Add better error handling | 🟡 Medium | Medium | Medium | Log unmapped postings, alert on failures |
| Document Oracle ID rationale | 🟢 Low | Low | Low | Add inline comments and docs |
| Audit unused fields | 🟢 Low | Medium | Low | Remove companyDescription if confirmed unused |
| Add field-level comparison in sync | 🟢 Low | High | Low | Only if performance becomes an issue |
| Field | Type | Source | Purpose | Used In UI? |
|---|---|---|---|---|
_id |
String (PK) | SR refNumber + id | Unique identifier | ✅ Routing |
title |
String | SR item.name | Job title | ✅ Display |
location |
Reference | Mapped via locationMap | Wix Location item | ✅ Display |
city |
String | SR item.location.city | Denormalized for filtering | ✅ Filters |
country |
String | SR item.location.country (via isoToCountry) | Denormalized for filtering | ✅ Filters |
virtualTeam |
Reference | Mapped via teamsMaps | Public-facing team | ✅ Display |
team |
String | SR subGuild || guild (Oracle ID) | Oracle team ID for analytics | ❌ Backend only |
guild |
String | SR custom field (Oracle ID) | Oracle guild ID for analytics | ❌ Backend only |
department |
String | SR custom field (Oracle ID) | Oracle dept ID for analytics | ❌ Backend only |
jobDescription |
RichText | SR sections.jobAd.text | Job description | ✅ Display |
qualifications |
RichText | SR sections.requirements.text | Requirements | ✅ Display |
additionalInformation |
RichText | SR sections.companyDescription.text | About the team | ✅ Display |
companyDescription |
RichText | SR sections.companyDescription.text | Duplicate? | ❌ Unused |
applyLink |
String | SR shareableLink | Apply URL | ✅ Apply button |
isStudent |
Boolean | SR custom field | Student position flag | ✅ Badge/Filter |
isTemp |
Boolean | SR custom field | Temp position flag | ✅ Badge/Filter |
isIntern |
Boolean | SR custom field | Intern position flag | ✅ Badge/Filter |
isProgram |
Boolean | SR custom field | Program position flag | ✅ Badge/Filter |
entryLevel |
Boolean | SR custom field | Entry level flag | ✅ Badge/Filter |
isRemote |
Boolean | SR custom field | Remote work flag | ✅ Badge/Filter |
isFulltime |
Boolean | SR custom field | Full-time flag | ✅ Badge/Filter |
isManagerial |
Boolean | SR custom field | Managerial position flag | ✅ Badge/Filter |
seniorityLevel |
String | SR custom field | Seniority level | ❌ Not displayed |
types |
String[] | Calculated from boolean flags | Array of job types | ✅ Filters |
promoted |
Boolean | promoted-postings collection | Promoted job flag | ✅ Sorting |
reference |
String | SR refNumber | SR reference number | ❌ Backend only |
postingNumber |
String | SR id | SR posting ID | ❌ Backend only |
| Field | Type | Purpose |
|---|---|---|
_id |
String (PK) | Oracle Location ID (e.g., "200000000000214") |
title |
String | Display name (shown in CMS UI for references) |
googleName |
String | City name for SR matching (e.g., "Be'er Sheva") |
slug |
String | URL-friendly identifier |
order |
Number | Display order |
city |
String | City name |
country |
String | Country name |
about |
RichText | Location description |
coverImage |
Image | Location image |
benefits |
String[] | Local benefits list |
| Field | Type | Purpose |
|---|---|---|
_id |
String (PK) | Virtual team ID |
title |
String | Team display name |
slug |
String | URL-friendly identifier |
parent |
Reference (Self) | Parent team (null for top-level) |
order |
Number | Display order |
about |
RichText | Team description |
coverImage |
Image | Team cover image |
people |
Object[] | Team members (embedded from editPeople-v1) |
teamsValues |
Object[] | Team values (embedded from EditTeamValues-v1) |
teamsLinks |
Object[] | Team links (embedded from EditTeamLinks-v1) |
postingsCount |
Number | Calculated job count (runtime) |
| Field | Type | Purpose |
|---|---|---|
_id |
String (PK) | Mapping ID |
real |
Multi-Reference | Array of ClonedCentralDBOrganization IDs (Oracle team IDs) |
virtual |
Reference | Single virtual-structure ID |
| Field | Type | Source |
|---|---|---|
_id |
String (PK) | Oracle organization ID |
name |
String | Oracle team name |
organizationType |
String | Type (Department, Team, etc.) |
parentOrganizationId |
String | Parent org ID in Oracle |
effectiveStartDate |
Date | Oracle effective start date |
effectiveEndDate |
Date | Oracle effective end date |
HR adds/edits team members. Data hooks automatically update virtual-structure.people
HR adds/edits team links. Data hooks automatically update virtual-structure.teamsLinks
HR adds/edits team values. Data hooks automatically update virtual-structure.teamsValues
HR adds/edits location content. Data hooks automatically update Locations
HR adds/edits location-specific benefits. Data hooks automatically update Locations.benefits
| Collection | Purpose | Used In |
|---|---|---|
Blog/Posts |
Blog articles | Life at Wix page, Blog page |
Blog/Categories |
Blog categories | Blog filtering |
equalReports |
Equal opportunity reports | The Wix Way page |
esgReports |
ESG reports | The Wix Way page |
EarlyTalentPrograms |
Early talent programs | Early Talent page |
SrSources |
SR source tracking | Apply link tracking |
SearchKeywords |
Search keywords | Search functionality |
promoted-postings |
Promoted job references | Job listing sorting |