Korta uses PostgreSQL with Prisma ORM.
The data model is intentionally small and centered around users and shortened URLs.
| Field | Type | Required | Notes |
|---|
id | Int | Yes | Primary key, auto-increment. |
email | String | Yes | Unique user email. |
password | String | null | No | Present for email/password users. |
googleId | String | null | No | Unique Google OAuth identifier. |
name | String | null | No | Display name. |
apiKey | String | null | No | Unique integration key for X-API-Key. |
isVerified | Boolean | Yes | Email verification state. |
verificationToken | String | null | No | Temporary token for email verification flow. |
createdAt | DateTime | Yes | Auto-set on create. |
updatedAt | DateTime | Yes | Auto-updated on changes. |
| Field | Type | Required | Notes |
|---|
id | Int | Yes | Primary key, auto-increment. |
originalUrl | String | Yes | Destination URL. |
shortId | String | Yes | Unique short slug. |
clicks | Int | Yes | Click counter, default 0. |
userId | Int | null | No | Owner user id (nullable for anonymous/public links). |
createdAt | DateTime | Yes | Auto-set on create. |
updatedAt | DateTime | Yes | Auto-updated on changes. |
User (1) -> (N) Url: A user can own many shortened URLs.
Url (N) -> (0..1) User: A URL may belong to a user, or be anonymous (userId = null).
User.email is unique.
User.googleId is unique when present.
User.apiKey is unique when present.
Url.shortId is globally unique.