On this page
9. Database Model
PostgreSQL via Drizzle-ORM. Schema in packages/db/src/schema/index.ts.
9.1 Relations (Foreign Keys)#
| Parent | → | Child | Cardinality | On Delete |
|---|---|---|---|---|
users | → | projects | 1 : N | set null (ownerId) |
projects | → | pages | 1 : N | cascade (projectId) |
pages | → | pageTranslations | 1 : N | cascade (pageId) |
projects | → | deployments | 1 : N | cascade (projectId) |
projects | → | mediaAssets | 1 : N | cascade (projectId) |
pages | → | pages | 1 : N (self) | set null (parentId) |
llmCache | — | standalone | — | keyed on mdHash |
9.2 Tables in Detail#
users — Accounts
id(uuid),email(unique),passwordHash,displayName,createdAt,updatedAt
projects — Sites/Projects
id,ownerId→ usersname,slugdesignPack(string, defaultminimal)languages(csv string, e.g."de,en,fr")defaultLanguageprojectType(landing|product|conference|docs|wiki|portfolio|courses|blog|blank)docsConfig(jsonb — logo, topNavLinks, githubRepo)componentVariants(jsonb — Layout Primitive Defaults)- Cloudflare fields:
cfProjectName,customDomain,domainStatus,zoneTag,liveUrl,lastDeployedAt
pages — Markdown Pages
id,projectId→ projectstitle,slug(unique per Project)sortOrder,isHomePage,parentId(self-ref for hierarchy),showInNavmdContent(text)mdHash(sha256 for cache invalidation)generatedJson(ComponentMapping)componentVariants(jsonb — Page-Level Content Primitive Overrides)
pageTranslations — Translated Content
id,pageId→ pages,languagemdContent,mdHash,generatedJsontranslatedAt,isManuallyEdited
llmCache — Mapping Cache
mdHash(unique key)mappingJson- If a user regenerates an already mapped MD section → Cache-Hit, no LLM-Call
mediaAssets — Uploaded Files
id,projectId→ projectsfilename,storagePath,mimeType,sizeBytes,width,height,altstatus(pending|active) —pending= upload started but not confirmed; cleanup after 1h
deployments — Cloudflare Deploy Records
id,projectId→ projectscfDeploymentId— Cloudflare Pages IDstatus(queued|building|success|failure|canceled)url,completedAt,errorMessagecreatedByUserId,filesUploaded,filesCached