Drizzle + AWS RDS
Database Schema
PostgreSQL schema for Rave Reviews, connected via Drizzle ORM to AWS RDS when DATABASE_URL is set. Without it, the app uses mock data from src/lib/mock-data.ts.
Entity Relationship Diagram
┌─────────────┐ ┌─────────────┐ ┌──────────────┐
│ users │ │ venues │ │ artists │
├─────────────┤ ├─────────────┤ ├──────────────┤
│ id (PK) │ │ id (PK) │ │ id (PK) │
│ email │ │ slug │ │ slug │
│ username │ │ name │ │ name │
│ display_name│ │ neighborhood│ │ genre[] │
│ avatar_url │ │ borough │ │ bio │
└──────┬──────┘ └──────┬──────┘ └──────┬───────┘
│ │ │
│ 1 │ 1 │ M
│ │ │
▼ M ▼ M ┌──────┴───────┐
┌─────────────┐ ┌─────────────┐ │ event_artists│
│ reviews │◄──────│ events │──────►│ (junction) │
├─────────────┤ M:1 ├─────────────┤ M:M ├──────────────┤
│ id (PK) │ │ id (PK) │ │ event_id(FK) │
│ user_id(FK) │ │ venue_id(FK)│ │ artist_id(FK)│
│ event_id(FK)│ │ title │ └──────────────┘
│ venue_id(FK)│ │ date │
│ artist_id │ │ genre[] │
│ title │ └─────────────┘
│ body │
│ ratings... │ ┌─────────────┐ ┌──────────────┐
└──────┬──────┘ │ review_tags │ │ review_votes │
│ ├─────────────┤ ├──────────────┤
├─────────────►│ review_id │ │ user_id (FK) │
│ │ tag │ │ review_id(FK)│
│ └─────────────┘ └──────────────┘
│
└─────────────► review_photos (id, review_id, url)
┌─────────────────────┐
│ underground_parties │
├─────────────────────┤
│ id (PK) │
│ submitted_by (FK)───┼──► users
│ location_vague │ (when true: vague_area + borough only)
│ vague_area │ (when false: address + venue_name)
│ address │
│ status │ pending → approved → expired
└─────────────────────┘Tables & Fields
users
PKidUUID
emailVARCHAR(255)
usernameVARCHAR(50)
display_nameVARCHAR(100)
avatar_urlTEXT
bioTEXT
created_atTIMESTAMPTZ
venues
PKidUUID
slugVARCHAR(100)
nameVARCHAR(200)
neighborhoodVARCHAR(100)
boroughVARCHAR(50)
addressTEXT
capacityINTEGER
image_urlTEXT
tagsTEXT[]
created_atTIMESTAMPTZ
artists
PKidUUID
slugVARCHAR(100)
nameVARCHAR(200)
genreTEXT[]
bioTEXT
image_urlTEXT
created_atTIMESTAMPTZ
events
PKidUUID
slugVARCHAR(150)
titleVARCHAR(300)
dateDATE
FKvenue_idUUID
image_urlTEXT
genreTEXT[]
ticket_priceVARCHAR(50)
created_atTIMESTAMPTZ
event_artists
PKFKevent_idUUID
PKFKartist_idUUID
reviews
PKidUUID
FKuser_idUUID
FKevent_idUUID
FKvenue_idUUID
FKartist_idUUID
titleVARCHAR(200)
bodyTEXT
overall_ratingSMALLINT
sound_ratingSMALLINT
vibe_ratingSMALLINT
crowd_ratingSMALLINT
value_ratingSMALLINT
helpful_countINTEGER
created_atTIMESTAMPTZ
review_tags
PKFKreview_idUUID
PKtagVARCHAR(50)
review_votes
PKFKuser_idUUID
PKFKreview_idUUID
created_atTIMESTAMPTZ
review_photos
PKidUUID
FKreview_idUUID
urlTEXT
created_atTIMESTAMPTZ
underground_parties
PKidUUID
slugVARCHAR(150)
FKsubmitted_byUUID
titleVARCHAR(300)
descriptionTEXT
dateDATE
start_timeTIME
end_timeTIME
genreTEXT[]
lineupTEXT[]
location_vagueBOOLEAN
vague_areaVARCHAR(150)
location_hintTEXT
addressTEXT
venue_nameVARCHAR(200)
neighborhoodVARCHAR(100)
boroughVARCHAR(50)
ticket_infoVARCHAR(200)
statusVARCHAR(20)
image_urlTEXT
created_atTIMESTAMPTZ
Relationships
users→reviews1 → many
A user writes many reviewsvenues→events1 → many
A venue hosts many eventsevents→event_artistsmany ↔ many
Events feature multiple artistsartists→event_artistsmany ↔ many
Artists play at many eventsreviews→eventsmany → 1
Review optionally targets an eventreviews→venuesmany → 1
Review optionally targets a venuereviews→artistsmany → 1
Review optionally targets an artistreviews→review_tags1 → many
Reviews have searchable tagsusers→review_votesmany ↔ many
Users mark reviews as helpfulusers→underground_parties1 → many
Users submit underground party listingsConnected Stack
Database
AWS RDS / Aurora PostgreSQL
ORM
Drizzle ORM — run npm run db:push to sync
Auth
Guest user for now (u-guest) — add NextAuth/Clerk later
API
Next.js Server Actions in src/lib/actions.ts