Rave Reviews
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

usersreviews1 → many
A user writes many reviews
venuesevents1 → many
A venue hosts many events
eventsevent_artistsmany ↔ many
Events feature multiple artists
artistsevent_artistsmany ↔ many
Artists play at many events
reviewseventsmany → 1
Review optionally targets an event
reviewsvenuesmany → 1
Review optionally targets a venue
reviewsartistsmany → 1
Review optionally targets an artist
reviewsreview_tags1 → many
Reviews have searchable tags
usersreview_votesmany ↔ many
Users mark reviews as helpful
usersunderground_parties1 → many
Users submit underground party listings

Connected 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