eda-data-model-and-patterns
Education Data Architecture (EDA) data model deep dive: Contact-centric, Affiliations, Relationships, Account record types (Academic Program, Educational Institution, Sports Organization), Course_Offering__c, Term__c, Course_Connection__c patterns. NOT for Education Cloud setup (use education-cloud-eda-setup). NOT for generic data modeling.
Best use case
eda-data-model-and-patterns is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Education Data Architecture (EDA) data model deep dive: Contact-centric, Affiliations, Relationships, Account record types (Academic Program, Educational Institution, Sports Organization), Course_Offering__c, Term__c, Course_Connection__c patterns. NOT for Education Cloud setup (use education-cloud-eda-setup). NOT for generic data modeling.
Teams using eda-data-model-and-patterns should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/eda-data-model-and-patterns/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How eda-data-model-and-patterns Compares
| Feature / Agent | eda-data-model-and-patterns | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Education Data Architecture (EDA) data model deep dive: Contact-centric, Affiliations, Relationships, Account record types (Academic Program, Educational Institution, Sports Organization), Course_Offering__c, Term__c, Course_Connection__c patterns. NOT for Education Cloud setup (use education-cloud-eda-setup). NOT for generic data modeling.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# EDA Data Model and Patterns Activate when working with the Education Data Architecture (EDA) data model in depth: object relationships, record types, extension patterns, and the contact-centric philosophy that underpins it. EDA is the backbone of Education Cloud and underpins most higher-ed + K-12 Salesforce implementations. ## Before Starting - **Confirm EDA (HEDA) is installed.** EDA is a managed package; verify version and whether customization has already extended it. - **Understand the contact-centric philosophy.** Students, faculty, alumni, guardians — all Contacts. The model disambiguates role via Affiliations and Relationships, NOT by separate objects per role. - **Know the record types.** Many EDA objects (Account, Affiliation, Contact, Course_Offering__c) rely on record types for semantics. Without record types, the model collapses. ## Core Concepts ### Contact-centric model Every Person = Contact. Roles are expressed via: - **Affiliation__c** — Contact to Account relationship with role, status, dates (Student at MIT, Faculty at Harvard, Staff at a program). - **Relationship__c** — Contact to Contact (Parent, Sibling, Advisor, Partner) with bidirectional symmetry handled by trigger. ### Account record types - `Academic_Program` — a program offered by an institution. - `Educational_Institution` — the school/university itself. - `Household_Account` — a Household (parallel to NPSP). - `Sports_Organization`, `Business_Organization` — extracurricular affiliations. ### Course data model - `Course__c` — the abstract course (Intro to Biology). - `Course_Offering__c` — a specific instance of a course for a term (Biology 101, Fall 2025, Prof Smith). - `Term__c` — academic term. - `Course_Connection__c` — a student's enrollment in a Course_Offering (and the faculty's teaching assignment is also a Course_Connection with record type Faculty). ### Attributes Student health, test scores, demographics often live in `Attribute__c` (a generic key-value pattern) to avoid endless fields on Contact. This is a contested design choice — it trades schema clarity for extensibility. ## Common Patterns ### Pattern: Student → Institution via Affiliation__c When a student enrolls: create Contact, create Affiliation__c with Role = "Student", Status = "Current", related Account = Academic_Program. Historical affiliations remain with Status = "Former" when they graduate. ### Pattern: Faculty teaching assignment Faculty are Contacts with an Affiliation__c (Role = "Faculty") to the Academic_Program. Their teaching load is Course_Connection__c with record type "Faculty" (or similar) to a Course_Offering__c. ### Pattern: Parent / Guardian Guardian is a Contact. Relationship__c between student Contact and guardian Contact with Type = "Parent". Bidirectional trigger creates the reverse Relationship__c automatically. ### Pattern: Multi-campus student Student Contact has multiple Affiliations to different Account (Academic_Program) records, each with its own status. Reports aggregate by Affiliation, not Contact. ## Decision Guidance | Question | Answer | |---|---| | Where do I store student role? | `Affiliation__c` with Role = Student | | Where do I store parent relationship? | `Relationship__c` with Type = Parent | | Where do I store enrollment in a specific class? | `Course_Connection__c` | | Where does graduation date live? | End Date on the Student Affiliation | | Where do I store extended demographics? | Prefer fields on Contact; use Attribute__c only when schema truly varies | ## Recommended Workflow 1. Document the real-world concepts (student, faculty, course, term) and map each to an EDA object + record type. 2. Draft the ERD with record types called out explicitly. 3. Build a reference dataset: 10 students, 5 courses, 2 terms, 3 faculty. 4. Validate reports and Affiliation rollups work on the reference dataset. 5. Plan any extensions as fields on existing EDA objects; avoid shadow custom objects. 6. Map integration fields (SIS → EDA) with record type resolution. 7. Write an admin runbook for onboarding new student → Contact → Affiliation → Course_Connection. ## Review Checklist - [ ] All record types in use are documented - [ ] Reference dataset exercises all role/relationship variants - [ ] Affiliation status and date semantics are agreed - [ ] Course / Course_Offering / Course_Connection consistently modeled - [ ] Attribute__c usage deliberately scoped - [ ] SIS and LMS integrations map to correct record types - [ ] Reports on Affiliation and Course_Connection match source data ## Salesforce-Specific Gotchas 1. **Relationship__c bidirectional trigger runs on insert/update.** Bulk loads must expect double the record count. 2. **Course_Connection__c has record types that change the page layout.** A "Student" connection and a "Faculty" connection use the same object — layout validation is per record type. 3. **Affiliation rollups (Primary Affiliation, Primary Household) are governed by EDA settings.** Changing the hierarchy setting after data load causes rollup drift. ## Output Artifacts | Artifact | Description | |---|---| | EDA ERD with record types | Canonical schema view | | Object + field dictionary | Detailed field-level reference | | Record-type matrix | Object × record type × use case | | SIS/LMS mapping | Integration field map | ## Related Skills - `admin/education-cloud-eda-setup` — install + configure - `integration/integration-pattern-selection` — SIS integration patterns - `data/data-import-pipelines` — large-volume student loads
Related Skills
sandbox-data-masking
Use this skill when configuring or reviewing Salesforce Data Mask to protect PII/PHI in partial or full copy sandboxes after a refresh. Trigger keywords: data mask, sandbox masking, PII in sandbox, GDPR sandbox, HIPAA non-production, mask contacts, obfuscate fields non-production. NOT for sandbox refresh mechanics (use sandbox-refresh-and-templates), NOT for production data anonymization, NOT for Shield Platform Encryption at rest.
mfa-enforcement-patterns
Design MFA enforcement: auto-enablement, Salesforce Authenticator rollout, exceptions, service accounts, API-only users, SSO interop, and audit. Trigger keywords: MFA, multi-factor, two-factor, Salesforce Authenticator, MFA exception, MFA SSO, api-only MFA. Does NOT cover: end-user password policies, device-trust posture, or non-Salesforce IdP configuration.
gdpr-data-privacy
Use this skill when implementing GDPR or CCPA data privacy controls in Salesforce: Individual sObject linkage, consent tracking, Right to Be Forgotten (RTBF) requests, data subject request handling, and Privacy Center configuration. Trigger keywords: GDPR, data privacy, consent management, right to erasure, Individual object, ContactPointConsent, ShouldForget, data subject request, Privacy Center, data portability. NOT for general data quality cleanup, duplicate management, field-level encryption (see platform-encryption skill), or sandbox data masking (see sandbox-data-masking skill).
encrypted-field-query-patterns
Design SOQL, filters, reporting, and indexes against Shield Platform Encryption fields. Trigger keywords: Shield Platform Encryption, encrypted field query, probabilistic vs deterministic encryption, encrypted SOQL filter, encrypted field index. Does NOT cover: Classic Encryption (deprecated), field-level security policy, or tenant secret key rotation.
data-classification-labels
Classify Salesforce fields by data sensitivity and compliance category using the four built-in classification attributes (SecurityClassification, ComplianceGroup, BusinessOwnerId, BusinessStatus). Covers Metadata API deployment, Tooling API querying, and Einstein Data Detect recommendations. NOT for data masking, Shield Platform Encryption, or runtime access control enforcement.
customer-data-request-workflow
Implement GDPR/CCPA data subject rights (access, deletion, rectification) using Salesforce Privacy Center and/or custom workflow. NOT for general backup or org-level data retention policy.
apex-managed-sharing-patterns
Grant row-level access programmatically via __Share records when declarative sharing rules cannot express the policy. NOT for OWD, role hierarchy, or criteria-based sharing rule design.
omnistudio-testing-patterns
Use when testing or validating OmniStudio components — OmniScript preview, Integration Procedure step debugging, DataRaptor field-mapping validation, and end-to-end UTAM-based automation. NOT for Apex unit testing or standard Flow debugging.
omnistudio-error-handling-patterns
Use when designing fault behavior across Integration Procedures, DataRaptors, OmniScripts, and FlexCards — error routing, user-facing messaging, retry semantics, and idempotency. Triggers: 'omnistudio error', 'integration procedure fault', 'dataraptor error handling', 'omniscript retry', 'flexcard action failure'. NOT for general Apex exception design or Flow fault paths.
omnistudio-deployment-datapacks
Use when exporting, importing, or version-controlling OmniStudio components using DataPacks via the OmniStudio DataPacks tool or vlocity CLI. Covers DataPack export/import, Git version control integration, CI/CD for OmniStudio. NOT for SFDX-based metadata deployment of non-OmniStudio components.
omnistudio-ci-cd-patterns
Use when designing or implementing CI/CD pipelines for OmniStudio components — DataPack export/import, versioning, environment promotion, and automated deployment. NOT for standard Salesforce metadata CI/CD or Apex-only pipelines.
omnistudio-asynchronous-data-operations
Use Integration Procedures queues, DataRaptor Chain, and Remote Actions with async patterns for long-running OmniStudio flows. NOT for simple DataRaptor reads.