Files
geek-life/docs/database_schema.md

2.0 KiB

Database Schema Design for Multi-Tenant Geek-Life

Overview

This document outlines the PostgreSQL database schema for the multi-tenant version of Geek-Life.

Tables

tenants

  • id (BIGSERIAL PRIMARY KEY)
  • name (VARCHAR(255) NOT NULL)
  • created_at (TIMESTAMP NOT NULL DEFAULT NOW())
  • updated_at (TIMESTAMP NOT NULL DEFAULT NOW())

users

  • id (BIGSERIAL PRIMARY KEY)
  • tenant_id (BIGINT NOT NULL REFERENCES tenants(id))
  • username (VARCHAR(100) NOT NULL)
  • email (VARCHAR(255) NOT NULL)
  • password_hash (VARCHAR(255) NOT NULL)
  • created_at (TIMESTAMP NOT NULL DEFAULT NOW())
  • updated_at (TIMESTAMP NOT NULL DEFAULT NOW())
  • UNIQUE(tenant_id, username)
  • UNIQUE(tenant_id, email)

projects

  • id (BIGSERIAL PRIMARY KEY)
  • tenant_id (BIGINT NOT NULL REFERENCES tenants(id))
  • user_id (BIGINT NOT NULL REFERENCES users(id))
  • title (VARCHAR(255) NOT NULL)
  • uuid (UUID NOT NULL DEFAULT gen_random_uuid())
  • created_at (TIMESTAMP NOT NULL DEFAULT NOW())
  • updated_at (TIMESTAMP NOT NULL DEFAULT NOW())
  • INDEX(tenant_id, user_id)
  • UNIQUE(uuid)

tasks

  • id (BIGSERIAL PRIMARY KEY)
  • tenant_id (BIGINT NOT NULL REFERENCES tenants(id))
  • user_id (BIGINT NOT NULL REFERENCES users(id))
  • project_id (BIGINT NOT NULL REFERENCES projects(id))
  • uuid (UUID NOT NULL DEFAULT gen_random_uuid())
  • title (VARCHAR(500) NOT NULL)
  • details (TEXT)
  • completed (BOOLEAN NOT NULL DEFAULT FALSE)
  • due_date (TIMESTAMP)
  • created_at (TIMESTAMP NOT NULL DEFAULT NOW())
  • updated_at (TIMESTAMP NOT NULL DEFAULT NOW())
  • INDEX(tenant_id, user_id)
  • INDEX(project_id)
  • INDEX(completed)
  • INDEX(due_date)
  • UNIQUE(uuid)

user_sessions

  • id (BIGSERIAL PRIMARY KEY)
  • user_id (BIGINT NOT NULL REFERENCES users(id))
  • token (VARCHAR(255) NOT NULL UNIQUE)
  • expires_at (TIMESTAMP NOT NULL)
  • created_at (TIMESTAMP NOT NULL DEFAULT NOW())
  • INDEX(token)
  • INDEX(expires_at)

Row Level Security (RLS)

All tables will have RLS enabled to ensure users can only access their own data within their tenant.