Files
goodgo-platform/docs/db/ERD.md
Database Architect 1a77ab625e docs(db): add ERD + schema audit for TEC-3010
Generated from prisma/schema.prisma (41 models, 37 enums):
- docs/db/ERD.md: Mermaid ERD + domain map
- docs/db/schema-audit.md: per-model findings with severity + 10 cross-cutting findings

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-21 00:53:21 +07:00

4.1 KiB

GoodGo Platform — Entity Relationship Diagram

Generated from prisma/schema.prisma as part of TEC-3010 (Epic: TEC-3006 — Database Schema Hardening).

  • Database: PostgreSQL 16 + PostGIS
  • ORM: Prisma
  • Models: 41
  • Enums: 37
  • Geospatial models: Property, ProjectDevelopment, IndustrialPark, POI, TransferListing, InfrastructureProject (all use geometry(Point, 4326) indexed with GiST)

High-level domain map

Domain Key models
Auth / identity User, Agent, RefreshToken, OAuthAccount, MfaChallenge
Residential listings Property, PropertyMedia, Listing, PriceHistory, ProjectDevelopment
Industrial / KCN IndustrialPark, IndustrialListing
Transfer (furniture + premises) TransferListing, TransferItem
Search & save SavedSearch, SavedListing
Transactions / commerce Transaction, Inquiry, Lead, Order, Escrow, Payment
Subscriptions Plan, Subscription, UsageRecord
Messaging Conversation, ConversationParticipant, Message
Analytics / AI Valuation, MarketIndex, Report, MacroeconomicData, InfrastructureProject
Neighborhood POI, NeighborhoodScore
Moderation / audit AdminAuditLog, ModerationAuditLog, Review
Notifications NotificationLog, NotificationPreference
System SystemSetting

Mermaid ERD

erDiagram
  User ||--o| Agent : has
  User ||--o{ Listing : sells
  User ||--o{ SavedSearch : owns
  User ||--o| Subscription : holds
  User ||--o{ Payment : makes
  User ||--o{ Review : writes
  User ||--o{ Inquiry : sends
  User ||--o{ RefreshToken : owns
  User ||--o{ OAuthAccount : links
  User ||--o{ Transaction : buys
  User ||--o{ Order : buys_or_sells
  User ||--o{ MfaChallenge : authenticates
  User ||--o{ TransferListing : lists
  User ||--o{ Report : requests
  User ||--o{ SavedListing : saves
  User ||--o{ ProjectDevelopment : owns
  User ||--o{ IndustrialPark : operates

  Agent ||--o{ Listing : represents
  Agent ||--o{ Lead : manages

  ProjectDevelopment ||--o{ Property : contains
  Property ||--o{ Listing : published_as
  Property ||--o{ Valuation : valued_by
  Property ||--o{ PropertyMedia : has

  Listing ||--o{ Transaction : spawns
  Listing ||--o{ Inquiry : receives
  Listing ||--o{ Order : generates
  Listing ||--o{ PriceHistory : tracks
  Listing ||--o{ SavedListing : saved_as

  Transaction ||--o{ Payment : settled_by
  Order ||--o| Escrow : protected_by
  Order ||--o{ Payment : paid_by

  Plan ||--o{ Subscription : sold_as
  Subscription ||--o{ UsageRecord : meters

  IndustrialPark ||--o{ IndustrialListing : leases

  Conversation ||--o{ ConversationParticipant : has
  Conversation ||--o{ Message : contains

  TransferListing ||--o{ TransferItem : contains

The Mermaid diagram above intentionally omits cardinality-only links that do not have Prisma-level relations (e.g. Review.targetId polymorphic references, ModerationAuditLog.targetId, AdminAuditLog.targetId, NotificationLog.userId).

Detached / polymorphic references

These fields reference other entities by id but lack a Prisma relation — they are polymorphic on purpose, but they sidestep referential integrity:

  • Review.targetType + Review.targetId → any listing/property/agent
  • ModerationAuditLog.targetType + .targetId → any moderatable entity
  • AdminAuditLog.targetId + .targetType → user/listing/subscription
  • NotificationLog.userIdUser.id (no FK)
  • ConversationParticipant.userIdUser.id (no FK)
  • Message.senderIdUser.id (no FK)
  • IndustrialListing.sellerId / .agentIdUser.id / Agent.id (no FK)
  • Lead.source (string), Review.targetType (string) — no enum
  • Conversation.listingIdListing.id (no FK)

See schema-audit.md → section Findings for severity.

Rendered diagram

The Mermaid block above renders directly in GitHub, GitLab and most Markdown viewers. For an offline PNG/SVG, run:

npx @mermaid-js/mermaid-cli -i docs/db/ERD.md -o docs/db/ERD.png