Back to flin
flin

Contraintes et validation dans FlinDB

Comment FlinDB applique l'intégrité des données avec des contraintes déclaratives -- unique, required, check, pattern, immutable et plus -- le tout sans écrire un seul trigger SQL.

Juste A. Gnimavo (Thales) & Claude | March 26, 2026 2 min flin
EN/ FR/ ES
flinflindbconstraintsvalidationintegrity

Une base de données qui accepte tout est une base de données qui contient des déchets. L'intégrité des données n'est pas une fonctionnalité optionnelle -- c'est le fondement dont chaque couche applicative au-dessus de la base de données dépend.

FlinDB implémente un système de contraintes déclaratif, lisible et complet. La session 161 fut le marathon qui l'a rendu réel -- neuf types de contraintes, 31 tests, et un système de cascade qui gère correctement la suppression douce et la destruction dure.

Les trois niveaux de contraintes

P1 : contraintes essentielles

Contraintes d'unicité : ``flin entity User { email: text @unique username: text @unique } ``

Contraintes required : les champs sans le suffixe ? sont requis par défaut.

Application des clés étrangères : vérifie que les entités référencées existent.

Comportement ON DELETE : cascade, restrict, set_null.

P2 : contraintes importantes

Contraintes check : ``flin entity Product { price: number @check(price > 0) quantity: int @check(quantity >= 0) } ``

Required conditionnel : ``flin entity Order { delivery_type: text shipping_address: text @required_if(delivery_type == "shipping") } ``

Validation par pattern : ``flin entity User { email: text @pattern(email, "^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9.-]+$", "Invalid email format") } ``

P3 : contraintes utiles

Unique partielle, unique insensible à la casse, champs immuables.

Messages d'erreur qui aident

Les messages d'erreur de FlinDB sont conçus pour être compris immédiatement :

  • "User with email '[email protected]' already exists" (violation d'unicité)
  • "User requires field 'name' but it was not provided" (violation required)
  • "Product price must satisfy: price > 0" (violation check)
  • "Transaction field 'amount' is immutable and cannot be changed" (violation d'immuabilité)

Pourquoi les contraintes appartiennent au modèle de données

Quand les contraintes vivent dans la couche applicative, elles peuvent être contournées. Quand les contraintes sont déclaratives -- écrites comme annotations sur les champs d'entité -- elles servent à la fois de validation et de documentation.

Le système de contraintes de FlinDB n'est pas une fonctionnalité. C'est une philosophie : le modèle de données doit être complet et auto-appliqué.


Ceci est la partie 4 de la série « How We Built FlinDB ».

Navigation de la série : - [056] FlinDB: Zero-Configuration Embedded Database - [057] Entities, Not Tables - [058] CRUD Without SQL - [059] Constraints and Validation in FlinDB (vous êtes ici) - [060] Aggregations and Analytics

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles

Thales & Claude deblo

Le Step Zero ne suffisait pas : comment valider un constructeur sans valider le runtime a fait tomber toutes les sessions vocales de Déblo l’heure où nous avons livré le streaming caméra temps réel

La phase 14 a livré Déblo Eyes — streaming caméra temps réel via LiveKit vers Gemini Live native audio. Le premier deploy a fait tomber toutes les sessions vocales en production en quatre-vingt-dix secondes parce que notre Step 0 avait validé le constructeur sans exercer le runtime. Le build log de comment Déblo a eu des yeux, ce qu’un pré-vol incomplet a coûté, et quels points de polish ont été livrés ou reportés.

33 min May 20, 2026
debloclaude-opus-4.7claude-codegemini-live +25
Thales & Claude deblo

Le tiret cadratin qui a tué la production : comment un slogan marketing dans un header HTTP a fait tomber le chat de Déblo pendant 24 heures

Deux jours avant la soumission App Store, tout le produit chat de Déblo s’est cassé silencieusement. Pas de spinner, pas de toast, aucune erreur dans l’UI — juste un silence radio. L’incident de 24 heures se résumait à un seul « é » dans la valeur d’un header HTTP qui levait une UnicodeEncodeError avant qu’aucune requête vers OpenRouter ne quitte le backend. Post-mortem d’une fausse hypothèse, d’une trace Sentry, et d’un fix de six lignes qui a débloqué le lancement.

30 min May 19, 2026
debloclaude-opus-4.7claude-codeincident +19
Thales & Claude deblo

Six heures, d’une page blanche à la review Apple — Comment nous avons soumis Déblo à l’App Store, en direct

Marche à marche en direct de la soumission de Déblo à l’App Store iOS en six heures : ce que les validateurs d’Apple ont rejeté (un superscript Unicode), ce que nous avons corrigé (un Promotional Text gaspillé sur des marques tierces), et les rouages de l’ASO iOS que presque tout le monde rate.

30 min May 13, 2026
debloclaude-opus-4.7claude-codeapp-store +16