Skip to content

Database

This document defines the database architecture, data modeling principles, naming conventions, relationships, lifecycle management, and governance for MHMD Studio. The database should remain scalable, secure, maintainable, and independent from application-specific implementation details.


Document Metadata

PropertyValue
DocumentDatabase
Version1.0
StatusActive
OwnerMohammed El Maachi
Last UpdatedJuly 2026

Purpose

The database is the single source of truth for all persistent application data.

Its objectives are to:

  • Store data reliably.
  • Preserve data integrity.
  • Support scalability.
  • Enable efficient querying.
  • Minimize duplication.
  • Support future products.

Application code should adapt to the database, not the reverse.


Database Philosophy

The database should be:

  • Normalized where practical.
  • Explicit.
  • Predictable.
  • Secure.
  • Extensible.
  • Well documented.

Every table should represent a real business entity.


Primary Database

Primary Database:

PostgreSQL

Managed through:

Supabase

Reasons:

  • ACID compliance
  • Mature ecosystem
  • Strong relational capabilities
  • Full-text search
  • Row Level Security
  • JSON support
  • Excellent tooling

Core Principles

Every table should have:

  • One responsibility.
  • A primary key.
  • Created timestamp.
  • Updated timestamp.

Optional:

  • Soft delete timestamp.
  • Created by.
  • Updated by.

Naming Conventions

Tables:

Plural

Examples:

text
users

projects

articles

categories

services

Columns:

snake_case

Examples:

text
created_at

updated_at

published_at

project_slug

reading_time

Primary Keys

Use UUIDs.

Example:

text
id UUID PRIMARY KEY

Avoid sequential IDs for public entities.


Foreign Keys

Every relationship should use explicit foreign keys.

Never rely on implicit relationships.

Database constraints should enforce integrity.


Standard Columns

Every primary table should contain:

text
id

created_at

updated_at

Optional:

text
deleted_at

created_by

updated_by

Soft Deletes

Prefer soft deletes for user-generated content.

Use:

text
deleted_at

instead of permanent deletion where recovery is valuable.


Timestamps

Store timestamps in UTC.

Convert to local time only within the presentation layer.


Core Entities

Initial entities include:

  • Users
  • Projects
  • Articles
  • Categories
  • Tags
  • Services
  • Resources
  • Contact Requests
  • Media Assets
  • AI Conversations (future)

The schema should remain extensible.


Users

Purpose:

Authentication and ownership.

Potential fields:

  • id
  • email
  • name
  • avatar_url
  • role
  • created_at
  • updated_at

Projects

Fields may include:

  • id
  • title
  • slug
  • summary
  • content
  • status
  • year
  • featured
  • cover_image
  • created_at
  • updated_at

Articles

Fields include:

  • id
  • title
  • slug
  • summary
  • content
  • reading_time
  • published_at
  • featured_image
  • author_id

Categories

Purpose:

Organize articles, resources, and projects.

Should remain reusable across multiple entities.


Tags

Tags provide flexible classification.

Avoid excessive tagging.

Each tag should have a clear purpose.


Services

Store:

  • Name
  • Slug
  • Description
  • Order
  • Visibility

Resources

May include:

  • Guides
  • Templates
  • Downloads
  • Tools

Store metadata separately from files.


Contact Requests

Fields:

  • Name
  • Email
  • Company
  • Budget
  • Service
  • Message
  • Status
  • Submitted At

Messages should never be publicly accessible.


Media Assets

Metadata should include:

  • File name
  • MIME type
  • Dimensions
  • Size
  • Alt text
  • Storage location

Do not duplicate binary files inside the database.


Relationships

Examples:

text
User



Articles



Categories



Tags
text
Project



Services



Technologies

Relationships should remain explicit.


Many-to-Many Relationships

Use junction tables.

Example:

text
article_tags

project_services

project_technologies

Avoid storing arrays of IDs.


Indexing

Create indexes for:

  • Primary keys
  • Foreign keys
  • Slugs
  • Published dates
  • Search fields

Avoid unnecessary indexes.


Use PostgreSQL full-text search where appropriate.

Search should support:

  • Articles
  • Projects
  • Resources

Semantic search may be added later.


Transactions

Use transactions whenever multiple related operations occur.

Atomic operations prevent inconsistent data.


Constraints

Use database constraints to enforce:

  • Uniqueness
  • Foreign keys
  • Required values
  • Valid ranges

Business rules should not rely solely on application code.


Row Level Security

Enable Row Level Security (RLS).

Policies should follow the principle of least privilege.

Public content should remain explicitly public.

Private content should remain inaccessible by default.


Migrations

All schema changes must use version-controlled migrations.

Never modify production schemas manually.

Every migration should be reversible whenever practical.


Backup Strategy

Backups should be:

  • Automated
  • Encrypted
  • Verified
  • Regularly tested

Recovery procedures should be documented.


Data Retention

Retention policies should define:

  • Contact requests
  • Logs
  • Analytics
  • Uploaded files
  • AI conversations

Retention should balance privacy, compliance, and operational needs.


Database Monitoring

Monitor:

  • Query performance
  • Storage usage
  • Slow queries
  • Connection counts
  • Replication health
  • Backup status

Problems should be detected proactively.


AI Compatibility

The schema should support future AI capabilities such as:

  • Embeddings
  • Vector search
  • Conversation history
  • Knowledge retrieval
  • Prompt library
  • Agent memory

AI-related data should remain isolated from core business entities where appropriate.


Database Quality Checklist

Before deploying schema changes verify:

  • Naming conventions followed.
  • Relationships documented.
  • Constraints implemented.
  • Indexes reviewed.
  • RLS configured.
  • Migrations tested.
  • Documentation updated.
  • Performance evaluated.

Final Principle

The database is a long-term asset.

Schema decisions should optimize for clarity, integrity, and future evolution rather than short-term convenience.



End of Document

Designed & Built with precision.