Back to flin
flin

Relations et chargement Eager/Lazy

Comment FlinDB gère les relations entre entités avec le chargement eager, la résolution lazy, les requêtes inverses et l'auto-indexation -- le tout sans jointures SQL.

Thales & Claude | March 30, 2026 2 min flin
EN/ FR/ ES
flinflindbrelationshipsloadingjoins

Le problème le plus difficile dans l'abstraction de base de données n'est pas le stockage. C'est la navigation des relations. FlinDB adopte une approche différente : des déclarations de relations explicites, l'indexation automatique, et des stratégies de chargement contrôlées.

La session 164 a été celle où les relations sont devenues réelles. Dix fonctionnalités, treize tests, neuf cent soixante-douze lignes de Rust.

Déclarer des relations

flinentity Post {
    title: text
    body: text
    author: User           // One-to-many
}

entity Article {
    title: text
    tags: [Tag]            // Many-to-many
}

Chargement eager avec .with()

rustlet results = db.query("Post")
    .with("author")
    .execute()?;

Le .with("author") indique au constructeur de requêtes de résoudre la référence author pour chaque Post dans le résultat. Au lieu de N recherches séparées, ZeroCore résout toutes les références en lot.

Requêtes par référence

rustlet user_posts = db.query("Post")
    .where_ref("author", user_id)
    .execute()?;

Parce que les champs de référence sont automatiquement indexés, les requêtes par référence bénéficient de recherches d'index O(1).

Requêtes inverses

rustlet posts = db.find_referencing("Post", "author", user_id)?;
if db.has_references("Post", "author", user_id)? {
    // Cannot delete user -- they have posts
}
let post_count = db.count_references("Post", "author", user_id)?;

La décision de stratégie de chargement

FlinDB n'a pas de chargement lazy implicite. C'est un choix de conception délibéré qui élimine une catégorie entière de bugs de performance (le problème N+1).

  • Pas d'appel .with() : les champs de référence contiennent l'ID brut. Pas de requête implicite.
  • Avec .with("author") : les champs de référence sont résolus en entités complètes.
  • Avec .with_all() : tous les champs de référence sont résolus.

Cela force le développeur à réfléchir à son pattern d'accès aux données au moment de la requête.


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

Navigation de la série : - [060] Aggregations and Analytics - [061] Index Utilization - [062] Relationships and Eager/Lazy Loading (vous êtes ici) - [063] Transactions and Continuous Backup - [064] Graph Queries and Semantic Search

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles