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