Entity Relationship Model

Overview of the Philanthropy Data Commons Model

The Philanthropy Data Commons (PDC) uses a structured, interoperable philanthropy data model to support accurate, consistent, and consent-based data sharing across the grantmaking ecosystem. Entites will be added as needs arise for the sector.

This flexible entity relationship model infrastructure defines the core objects, relationships, and data flows involved in applying for, submitting, reviewing, and working with data across the sector. Enabling systems to exchange information across platforms without forcing a single standardized or limited format, the PDC Framework will continue to evolve.

The PDC Framework flexible data model helps the sector solve challenges identified in the PDC’s early pilots—reducing duplicate data entry, improving consistency, and making it easier for systems to reuse applicant information where consent allows but without having to force a standard on participating systems.

The PDC Entity Relationship Diagram

This diagram illustrates how core entities—Opportunities, Application Forms, Proposals, Field Values, and more—connect within the PDC framework.

erDiagram
  BaseField {
    string shortCode PK
    string label
    string description
    string dataType
    string category
    int valueRelevanceHours
    string sensitivityClassification
    datetime createdAt
  }
  BaseFieldLocalization {
    int id PK
    string baseFieldShortCode FK
    string language
    string label
    string description
    datetime createdAt
  }
  Changemaker {
    int id PK
    string taxId
    string name
    uuid keycloakOrganizationId
    datetime createdAt
  }
  ChangemakerFieldValue {
    int id PK
    int changemakerId FK
    string baseFieldShortCode FK
    int batchId FK
    string value
    boolean isValid
    datetime goodAsOf
    datetime createdAt
  }
  ChangemakerFieldValueBatch {
    int id PK
    int sourceId FK
    string notes
    datetime createdAt
  }
  ChangemakersProposal {
    int id PK
    int changemakerId FK
    int proposalId FK
    datetime createdAt
  }
  FiscalSponsorship {
    int fiscalSponseeChangemakerId PK_FK
    int fiscalSponsorChangemakerId PK_FK
    uuid createdBy FK
    datetime notAfter
    datetime createdAt
  }
  Proposal {
    int id PK
    int opportunityId FK
    string externalId
    uuid createdBy FK
    datetime createdAt
  }
  Opportunity {
    int id PK
    string title
    string funderShortCode FK
    datetime createdAt
  }
  ApplicationForm {
    int id PK
    int opportunityId FK
    int version
    datetime createdAt
  }
  ApplicationFormField {
    int id PK
    int applicationFormId FK
    string baseFieldShortCode FK
    int position
    string label
    string instructions
    datetime createdAt
  }
  ProposalVersion {
    int id PK
    int proposalId FK
    int sourceId FK
    int applicationFormId FK
    int version
    uuid createdBy FK
    datetime createdAt
  }
  ProposalFieldValue {
    int id PK
    int proposalVersionId FK
    int applicationFormFieldId FK
    int position
    string value
    boolean isValid
    datetime goodAsOf
    datetime createdAt
  }
  DataProvider {
    string shortCode PK
    string name
    uuid keycloakOrganizationId
    datetime createdAt
  }
  Funder {
    string shortCode PK
    string name
    uuid keycloakOrganizationId
    boolean isCollaborative
    datetime createdAt
  }
  Source {
    int id PK
    string label
    string funderShortCode FK
    int changemakerId FK
    string dataProviderShortCode FK
    datetime createdAt
  }
  File {
    int id PK
    string region
    int s3BucketId FK
    string fileKey
    string mediaType
    uuid createdBy FK
    datetime createdAt
  }
  BulkUploadTask {
    int id PK
    string status
    int sourceId FK
    int proposalsDataFileId FK
    int attachmentsArchiveFileId FK
    string funderShortCode FK
    uuid createdBy FK
    datetime createdAt
  }
  BulkUploadLog {
    int id PK
    int bulkUploadTaskId FK
    string message
    datetime createdAt
  }
  User {
    uuid keycloakUserId PK
    string keycloakUserName
    datetime createdAt
  }

  Proposal }|--|| Opportunity : "responds to"
  Opportunity ||--|{ ApplicationForm : establishes
  Funder ||--|{ Opportunity : has
  Funder ||--|{ BulkUploadTask : has
  ApplicationForm ||--|{ ApplicationFormField : has
  ApplicationFormField }o--|| BaseField : represents
  BaseField ||--o{ BaseFieldLocalization : "has localizations"
  Proposal ||--|{ ProposalVersion : has
  ProposalVersion ||--|{ ProposalFieldValue : contains
  ProposalVersion }o--|| ApplicationForm : "uses"
  ProposalFieldValue }o--|| ApplicationFormField : populates
  Changemaker ||--o{ ChangemakersProposal : "is associated with"
  Proposal ||--o{ ChangemakersProposal : "is associated with"
  Changemaker ||--o{ ChangemakerFieldValue : "has"
  ChangemakerFieldValue }o--|| BaseField : "is for"
  ChangemakerFieldValue }o--|| ChangemakerFieldValueBatch : "belongs to"
  ChangemakerFieldValueBatch }o--|| Source : "comes from"
  Source }|--o| Funder : "represents"
  Source }|--o| Changemaker : "represents"
  Source }|--o| DataProvider : "represents"
  ProposalVersion }o--|| Source : "comes from"
  Proposal }o--|| User : "is created by"
  ProposalVersion }o--|| User : "is created by"
  BulkUploadTask }o--|| User : "is created by"
  BulkUploadTask }o--|| Source : "uses"
  BulkUploadTask ||--o{ BulkUploadLog : "has"
  BulkUploadTask }o--|| File : "has proposals data"
  BulkUploadTask }o--o| File : "has attachments archive"
  User }o--o{ Changemaker : "is granted permissions for"
  User }o--o{ Funder : "is granted permissions for"
  User }o--o{ DataProvider : "is granted permissions for"
  User }o--o{ Opportunity : "is granted permissions for"
  Changemaker ||--o{ FiscalSponsorship : "sponsors"
  Changemaker ||--o{ FiscalSponsorship : "is sponsored by"

Please check-out the PDC Github for more details: https://github.com/PhilanthropyDataCommons/service/blob/main/docs/ENTITY_RELATIONSHIP_DIAGRAM.md

Core Entities in the PDC Model

Changemaker

The changemaker represents the organization connected to the data across the PDC Data Categories, proposals, and other fields.

Proposal

A proposal is the grouping of data with a specific Application Form. Proposals have versions when data changes or the Application Form changes.

Opportunity

An opportunity is a funding request, RFP, challenge, or open call from a funder. It defines what applicants must respond to.

Application Form

Application Forms are the combinations and sequencing of the BaseFields for the specific sets of data. The structure and the order of the data are detailed in these records.

Base Fields

Base fields are the core element of how the PDC handles and stores specific data. Base fields are constantly being added as new systems with additional needs come aboard the PDC.

Base fields have attributes around types, labels, and handling.

Source

Sources are used to track where the data orgination. External systems, data platforms, other third-party data providers supply data to the PDC and this is one key element to note where the data originated.

How the Model Supports Grantmaking

Prepopulation & Reuse

Data sourced and mapped to the PDC might vary from system to system, but can align via the PDC to leverage data that might be named or labelled differently on other platforms.

In combination with the core entities of the PDC to store and manage shared data, can serve data across different platforms and save funders and changemakers from re-entering information repeatedly.

Cross-System Interoperability

Because the model is consistent and API-driven, data can be exchanged between:

Consent-Driven Sharing

The model is aligned with PDC’s principle of centrality of changemakers, ensuring applicants control when and how their information is reused. Consent is asked at the source system then can be managed at PDC once data is sent.

document.addEventListener('click', function (e) { const link = e.target.closest('a.coming-soon'); if (!link) return; // stop the from reloading / jumping e.preventDefault(); }, true);