mirror of
https://github.com/forcedotcom/afv-library.git
synced 2026-07-30 03:09:50 +08:00
9.2 KiB
9.2 KiB
Salesforce Files Data Model Template
Pre-built data model for Salesforce Files (Content) using flowchart LR format with color coding and relationship indicators.
Objects Included
| Object | Type | Description |
|---|---|---|
| ContentDocument | STD | File container |
| ContentVersion | STD | File versions |
| ContentDocumentLink | STD | Links files to records |
| ContentWorkspace | STD | Content libraries |
| ContentWorkspaceDoc | STD | Library membership |
| ContentFolder | STD | Folder structure |
| ContentAsset | STD | Asset files |
Query Org Metadata (Recommended)
Enrich diagram with live org data:
python3 ../../scripts/query-org-metadata.py \
--objects ContentDocument,ContentVersion,ContentDocumentLink,ContentWorkspace \
--target-org myorg
Mermaid Template (Preferred)
Left-to-right flowchart with color coding.
%%{init: {"flowchart": {"nodeSpacing": 50, "rankSpacing": 80}} }%%
flowchart LR
%% ═══════════════════════════════════════════════════════════════
%% SALESFORCE FILES DATA MODEL
%% LEGEND: LK = Lookup (-->), MD = Master-Detail (==>)
%% Colors: Blue = Standard, Orange = Custom, Green = External
%% ═══════════════════════════════════════════════════════════════
%% Core Content Objects
ContentDoc["ContentDocument<br/>(count)"]
ContentVer["ContentVersion<br/>(count)"]
CDLink["ContentDocumentLink<br/>(count)"]
%% Library Objects
Library["ContentWorkspace<br/>(count)"]
LibDoc["ContentWorkspaceDoc<br/>(count)"]
Folder["ContentFolder<br/>(count)"]
%% Asset
Asset["ContentAsset<br/>(count)"]
%% Any Salesforce Record
Record["Any Record<br/>(Account, Case, etc.)"]
%% Content Structure
ContentDoc ==>|"MD"| ContentVer
ContentDoc -->|"LK"| CDLink
Record -->|"LinkedEntityId"| CDLink
%% Library Structure
Library ==>|"MD"| LibDoc
ContentDoc -->|"LK"| LibDoc
Library ==>|"MD"| Folder
%% Asset
ContentDoc -->|"LK"| Asset
%% Standard Objects - Sky Blue
style ContentDoc fill:#bae6fd,stroke:#0369a1,color:#1f2937
style ContentVer fill:#bae6fd,stroke:#0369a1,color:#1f2937
style CDLink fill:#bae6fd,stroke:#0369a1,color:#1f2937
style Library fill:#bae6fd,stroke:#0369a1,color:#1f2937
style LibDoc fill:#bae6fd,stroke:#0369a1,color:#1f2937
style Folder fill:#bae6fd,stroke:#0369a1,color:#1f2937
style Asset fill:#bae6fd,stroke:#0369a1,color:#1f2937
style Record fill:#ddd6fe,stroke:#6d28d9,color:#1f2937
Key Concepts
Content Architecture
ContentDocument (Container)
├── ContentVersion (Current + History)
├── ContentDocumentLink (Sharing to Records)
└── ContentWorkspaceDoc (Library Membership)
ContentDocument vs ContentVersion
| Object | Purpose |
|---|---|
| ContentDocument | File metadata container (one per file) |
| ContentVersion | Actual file data + versions |
Key: Always query ContentVersion for file data. ContentDocument is just the container.
ContentDocumentLink (CDL)
- Links ContentDocument to any Salesforce record
LinkedEntityIdis polymorphic (Account, Case, User, etc.)- Controls visibility/sharing
| ShareType | Visibility |
|---|---|
| V | Viewer |
| C | Collaborator |
| I | Inferred |
File Visibility
| Visibility | Access |
|---|---|
| AllUsers | All internal users |
| InternalUsers | Users with record access |
| SharedUsers | Explicitly shared users |
Simplified Version (Core Objects Only)
For presentations focusing on core file structure:
%%{init: {"flowchart": {"nodeSpacing": 50, "rankSpacing": 80}} }%%
flowchart LR
ContentDoc["ContentDocument"]
ContentVer["ContentVersion"]
CDLink["ContentDocumentLink"]
Record["Any Record"]
ContentDoc ==>|"MD"| ContentVer
ContentDoc -->|"LK"| CDLink
Record -->|"LinkedEntityId"| CDLink
style ContentDoc fill:#bae6fd,stroke:#0369a1,color:#1f2937
style ContentVer fill:#bae6fd,stroke:#0369a1,color:#1f2937
style CDLink fill:#bae6fd,stroke:#0369a1,color:#1f2937
style Record fill:#ddd6fe,stroke:#6d28d9,color:#1f2937
Content Libraries Model
For file library organization:
%%{init: {"flowchart": {"nodeSpacing": 50, "rankSpacing": 80}} }%%
flowchart LR
Library["ContentWorkspace<br/>(Library)"]
LibDoc["ContentWorkspaceDoc"]
Folder["ContentFolder"]
ContentDoc["ContentDocument"]
Member["ContentWorkspaceMember"]
User["User"]
Library ==>|"MD"| LibDoc
Library ==>|"MD"| Folder
Library ==>|"MD"| Member
ContentDoc -->|"LK"| LibDoc
User -->|"LK"| Member
style Library fill:#bae6fd,stroke:#0369a1,color:#1f2937
style LibDoc fill:#bae6fd,stroke:#0369a1,color:#1f2937
style Folder fill:#bae6fd,stroke:#0369a1,color:#1f2937
style ContentDoc fill:#bae6fd,stroke:#0369a1,color:#1f2937
style Member fill:#bae6fd,stroke:#0369a1,color:#1f2937
style User fill:#bae6fd,stroke:#0369a1,color:#1f2937
ASCII Fallback
┌─────────────────────────────────────────────────────────────────────────────┐
│ SALESFORCE FILES DATA MODEL (L→R) │
│ Legend: LK = Lookup (-->), MD = Master-Detail (==>) │
└─────────────────────────────────────────────────────────────────────────────┘
FILE STRUCTURE
┌──────────────────┐ ┌──────────────────┐
│ CONTENT_DOCUMENT │═══ MD ═>│ CONTENT_VERSION │
│ (count) │ │ (count) │
└────────┬─────────┘ └──────────────────┘
│
│ LK
▼
┌──────────────────────┐ ┌──────────────────┐
│CONTENT_DOCUMENT_LINK │<── LK ──│ ANY RECORD │
│ (count) │ │ (Account, Case) │
└──────────────────────┘ └──────────────────┘
LIBRARY STRUCTURE
┌──────────────────┐ ┌──────────────────────┐
│ CONTENT_WORKSPACE│═══ MD ═>│CONTENT_WORKSPACE_DOC │
│ (Library) │ │ (count) │
└────────┬─────────┘ └──────────┬───────────┘
│ │
│ MD │ LK
▼ ▼
┌──────────────────┐ ┌──────────────────────┐
│ CONTENT_FOLDER │ │ CONTENT_DOCUMENT │
│ (count) │ │ (count) │
└──────────────────┘ └──────────────────────┘
Key Relationships Summary
| Parent | Child | Type | Behavior |
|---|---|---|---|
| ContentDocument | ContentVersion | MD | Cascade delete |
| ContentDocument | ContentDocumentLink | LK | Sharing links |
| ContentWorkspace | ContentWorkspaceDoc | MD | Library files |
| ContentWorkspace | ContentFolder | MD | Library folders |
| ContentWorkspace | ContentWorkspaceMember | MD | Library members |
| ContentDocument | ContentWorkspaceDoc | LK | File in library |
| ContentDocument | ContentAsset | LK | Asset reference |
Limits & Considerations
| Limit | Value |
|---|---|
| File size | 2 GB (max) |
| Versions per file | 20 (default, configurable) |
| Libraries per org | Varies by edition |
| CDL per file | No hard limit (LDV) |
| Files storage | Org storage limit |
Common Queries
Files attached to a record
SELECT ContentDocumentId, ContentDocument.Title
FROM ContentDocumentLink
WHERE LinkedEntityId = '001xxx'
Latest version of a file
SELECT Id, Title, VersionData
FROM ContentVersion
WHERE ContentDocumentId = '069xxx'
AND IsLatest = true
Best Practices
- Use
flowchart LR- Left-to-right flow for readability - Keep objects simple - Name + record count only
- Replace
(count)placeholders - With actual counts from query - Add LDV indicator - For objects >2M records:
LDV[~4M] - Color code object types - Blue=Standard, Orange=Custom, Green=External