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
This entity relationship model is designed to make sharing data across systems possible
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:
- GMS platforms
- Data platforms
- PDC applications (like Exchange)
- future partner-built tools
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.