Aurabase Logo
aurabasedocs
docsFondationsConventions

Conventions

Naming des schémas, colonnes, policies RLS, helpers auth, index. Des conventions stables et documentées pour que votre équipe ait une seule façon de nommer les choses.

6 min de lecture·Niveau débutant·Révisé le 15 avr. 2026
#
Schémas

Un préfixe par domaine

§ 01

Chaque projet reçoit quatre sous-schémas préfixés project_{uuid}. Vos tables métier vont dans le schéma principal ; ne créez jamais d'objets dans les schémas système.

SchémaPropriétaireUsage
project_{uuid}vousTables, vues, fonctions métier
project_{uuid}_authaura-authUsers, sessions, MFA — ne pas toucher
project_{uuid}_storageaura-storageBuckets, objets, policies storage
project_{uuid}_platformplateformeFunctions, jobs, cron, secrets
#
Tables & colonnes

snake_case, pluriel, id uuid

§ 02
  • Tables au pluriel : posts, comments, invoices
  • Colonnes en snake_case : created_at, user_id, last_seen_at
  • Clés primaires id uuid primary key default gen_random_uuid() — pas de uuid_generate_v4()
  • Timestamps timestamptz, jamais timestamp nu
  • FKs suffixées _id : author_id, tenant_id
  • Booléens préfixés is_ ou has_
  • Pas de colonne project_id — le schéma est déjà l'isolant
exemple
SQL
create table posts (
id uuid primary key default gen_random_uuid(),
author_id uuid not null references users(id) on delete cascade,
title text not null,
is_published boolean not null default false,
created_at timestamptz not null default now()
);
Attention
Ne jamais ajouter de colonne project_id. L'isolation est déjà garantie par le schéma. Une colonne tenant multiplierait les index et fragiliserait la sécurité.
#
Helpers auth

Trois fonctions injectées dans chaque session

§ 03

Le gateway ouvre les connexions Postgres avec request.jwt.claims renseigné. Les trois helpers ci-dessous lisent ces claims et sont utilisables partout dans vos policies.

HelperRetour
auth.uid()uuid de l'utilisateur courant, NULL si anon
auth.role()text · anon / authenticated / service_role
auth.tenant()uuid du tenant courant (RBAC multi-tenant)
auth.has_role(name)boolean · true si le user a ce rôle applicatif
auth.email()text · email du user, lu depuis le JWT
auth.claim(key)jsonb · accès brut à un claim custom
#
Policies

Un nom prédictible, une opération, un rôle

§ 04

Convention : <table>_<scope>_<operation>. Exemple : posts_own_read, orders_admin_delete. Toujours préciser to authenticated ou to anon.

naming
SQL
-- ✓ Bon : table_scope_op
create policy "posts_own_read" on posts for select
create policy "orders_admin_all" on orders for all
-- ✗ À éviter
create policy "allow_stuff" -- trop vague
create policy "new_policy_42" -- pas descriptif
#
Indexes

Naming et quand indexer

§ 05
  • Nom : idx_<table>_<colonnes> ou uq_<table>_<colonnes> (unique)
  • Toujours indexer : les FKs, les colonnes de filter/order_by fréquents, les where des policies RLS
  • Ne pas indexer : colonnes booléennes à forte cardinalité low (utiliser partial index), tables < 1000 lignes
  • pgvector : using hnsw pour > 100k vecteurs, ivfflat sinon
Dernière mise à jour · 15 avr. 2026