Back to flin
flin

Des entités, pas des tables : comment FlinDB pense les données

Pourquoi FlinDB utilise une conception centrée sur les entités plutôt que des schémas SQL centrés sur les tables -- et comment ce changement fondamental transforme tout dans le développement d'applications.

Juste A. Gnimavo (Thales) & Claude | March 26, 2026 4 min flin
EN/ FR/ ES
flinflindbentitiesschemadata-model

Le modèle relationnel domine le stockage de données depuis cinquante ans. Tables, lignes, colonnes, clés étrangères, jointures. C'est une abstraction puissante -- et une terrible correspondance avec la façon dont les développeurs pensent réellement à leurs applications.

FlinDB élimine entièrement la traduction. Vous pensez en entités. Vous écrivez en entités. FlinDB stocke des entités. Il n'y a pas de décalage d'impédance parce qu'il n'y a pas de décalage.

La différence fondamentale

Dans SQL, vous définissez une table -- un conteneur pour des lignes. Dans FLIN, vous définissez une entité -- un concept de première classe dans le langage :

flinentity User {
    name: text
    email: text @unique
    age: int?
}

Quand vous sauvegardez une entité dans FlinDB, vous obtenez un objet avec un cycle de vie riche :

flinuser = User { name: "Thales", email: "[email protected]" }
save user

user.id          // 1 (auto-assigned)
user.created_at  // 2026-01-13T10:00:00Z
user.version     // 1

user.name = "Juste Thales"
save user
user.version     // 2

user.history     // [version 1, version 2]
user @ -1        // The previous version

Une entité n'est pas une ligne. C'est un objet versionné, horodaté, historiquement conscient, avec une identité qui persiste à travers les changements.

Types de champs : sémantiques, pas mécaniques

Les types de champs SQL décrivent des formats de stockage. Les types de champs FLIN sont sémantiques -- ils décrivent ce que les données sont, pas comment elles sont stockées.

TypeDescriptionExemple
textChaîne UTF-8"Hello"
intEntier 64 bits42
numberFlottant 64 bits3.14
boolBooléentrue
timeHorodatage UTCnow
moneyValeur monétaire1000 CFA
fileRéférence de fichierFichier uploadé
semantic textTexte avec embeddings IAContenu recherchable par IA

Le type semantic text est particulièrement frappant. Dans SQL, si vous voulez une recherche sémantique alimentée par l'IA, vous devez installer une extension vectorielle, configurer un pipeline d'embedding, gérer des index vectoriels et écrire des requêtes de similarité. Dans FLIN, vous écrivez :

flinentity Product {
    name: text
    description: semantic text
}

Relations : des références, pas des clés étrangères

flinentity Post {
    title: text
    body: text
    author: User              // Direct reference to a User entity
}

post.author          // Returns the full User entity, not an ID
post.author.name     // "Thales"

Pas de jointures. Pas de clauses ON. Vous référencez une entité, et la référence fonctionne.

Plusieurs-à-plusieurs sans tables de jonction

flinentity Post {
    title: text
    tags: [Tag]               // List of Tag references
}

Pas de table de jonction. Pas de requête de jointure. Pas de problème N+1 à résoudre.

Le modèle d'historique des versions

La différence la plus fondamentale entre FlinDB et une base de données relationnelle est le versionnage temporel. Dans SQL, un UPDATE détruit la valeur précédente. Dans FlinDB, chaque sauvegarde crée une nouvelle version :

flinuser = User { name: "Juste" }
save user                      // Version 1

user.name = "Juste G."
save user                      // Version 2

user @ -1                     // Version 1: "Juste"
user.history                  // All versions

Ce n'est pas une fonctionnalité boulonnée sur un modèle relationnel. C'est le modèle de stockage lui-même.

Pourquoi la conception centrée sur les entités est importante

La conception centrée sur les entités est particulièrement puissante pour le public que FLIN sert. Les étudiants à Abidjan, Dakar et Lagos qui apprennent à coder pour la première fois n'ont pas besoin d'apprendre SQL, les ORM, les migrations et les contraintes de clés étrangères avant de pouvoir construire leur première application. Ils définissent des entités, les sauvegardent et les interrogent. La base de données disparaît derrière le langage.


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

Navigation de la série : - [056] FlinDB: Zero-Configuration Embedded Database - [057] Entities, Not Tables: How FlinDB Thinks About Data (vous êtes ici) - [058] CRUD Without SQL - [059] Constraints and Validation in FlinDB - [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