Skip to content

Base de données

Schéma ERD


Index

TableIndexTypeUsage
archived_mailssearch_vectorGINRecherche full-text
archived_mailsgmail_account_idBTreeFiltrage par compte
archived_mailssenderBTreeFiltrage par expéditeur
archived_mailsdate DESCBTreeTri par date
archived_mailssize_bytes DESCBTreeTri par taille
archived_mails(gmail_account_id, deleted_at)BTree (partiel)Listing corbeille (WHERE deleted_at IS NOT NULL)
archived_attachmentsarchived_mail_idBTreeJoin mails ↔ PJ
jobsgmail_account_idBTreeFiltrage jobs par compte
jobsstatusBTreeFiltrage par statut
jobscreated_at DESCBTreeTri par date
jobsuser_idBTreeFiltrage jobs par utilisateur
usersgoogle_id (partiel)UniqueLookup SSO Google
audit_logsuser_id + created_atBTreeLogs par utilisateur
audit_logsaction + created_atBTreeFiltrage par action
webhooksuser_idBTreeFiltrage par utilisateur
notification_preferencesuser_idUniqueUne ligne par utilisateur
tracking_pixelsgmail_account_idBTreeFiltrage par compte
tracking_pixels(gmail_account_id, gmail_message_id)UniqueDédoublonnage scans
pii_findingsgmail_account_idBTreeFiltrage par compte
pii_findingsarchived_mail_idBTreeJoin mails ↔ PII
retention_policiesuser_idBTreeFiltrage par utilisateur
gmail_api_usage(gmail_account_id, recorded_at)BTreeStats quota par compte
gmail_api_usagerecorded_atBTreeNettoyage données anciennes
storage_configsuser_idUniqueUne config par utilisateur

Recherche full-text

Le champ search_vector est mis à jour automatiquement via un trigger PostgreSQL à chaque insert/update sur archived_mails :

sql
-- Poids de recherche :
-- A (le plus fort) : sujet
-- B : expéditeur
-- C : snippet (extrait du corps)
NEW.search_vector :=
  setweight(to_tsvector('french', COALESCE(NEW.subject, '')), 'A') ||
  setweight(to_tsvector('french', COALESCE(NEW.sender, '')), 'B') ||
  setweight(to_tsvector('french', COALESCE(NEW.snippet, '')), 'C');

Exemple de requête de recherche :

sql
SELECT *, ts_rank(search_vector, query) AS rank
FROM archived_mails, to_tsquery('french', 'facture & 2024') query
WHERE gmail_account_id = $1
  AND search_vector @@ query
ORDER BY rank DESC, date DESC;

JSONB — Format des règles

conditions (tableau)

json
[
  { "field": "from", "operator": "contains", "value": "newsletter@" },
  { "field": "subject", "operator": "contains", "value": "promotion" }
]

Champs supportés : from, to, subject, has_attachment, size_gt (octets)

Opérateurs : contains, equals, not_contains, gt, lt

action (objet)

json
{ "type": "trash" }
{ "type": "label", "labelId": "Label_123" }
{ "type": "archive" }
{ "type": "archive_nas" }