Skip to content

Commit 3da47a9

Browse files
Ajout d'un nouvel article
1 parent bb8f3b0 commit 3da47a9

File tree

1 file changed

+102
-0
lines changed

1 file changed

+102
-0
lines changed

_posts/2025-05-19-guid-versus-id.md

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
---
2+
title: GUID vs ID auto-incrémenté - dilemme et solutions en environnement .NET distribué
3+
date: 2025-05-19 13:00:00 -0400
4+
categories: []
5+
tags: [dotnet]
6+
---
7+
8+
## Préambule
9+
10+
Je me souviens encore d’une réunion mouvementée avec un DBA, alors que nous discutions de l’architecture d’un nouveau système **.NET** réparti sur plusieurs services. Lorsque j’ai osé proposer d’utiliser des GUID comme clés primaires au lieu des habituels identifiants auto-incrémentés, j’ai vu des yeux s’écartiller. *« Pourquoi changer une recette qui marche ? »* m’a-t-on lancé. En bon développeur, j’avais moi-même toujours apprécié la simplicité des IDs séquentiels (1, 2, 3, …). Mais dans un environnement **distribué et asynchrone**, cette vieille recette commençait à montrer ses limites.
11+
12+
Dans cet article, je vous propose un retour d’expérience sur ce choix technique. Nous verrons pourquoi les GUID peuvent s’avérer pratiques (et comment les utiliser intelligemment), sans occulter les inconvénients bien réels qui rendent certains DBA méfiants. Installez-vous confortablement, on va parler d’**identifiants**, de **.NET/Entity Framework**, d’**index**, de **sécurité**, de **tests** et de **compromis astucieux**.
13+
14+
## Le dilemme dans un monde distribué
15+
16+
Identifiants auto-incrémentés ou GUID ? Le débat est ancien. Dans un monde monolithique, les identifiants séquentiels (souvent de type `int`) brillent par leur simplicité, leur performance, et leur tri naturel. Mais dès que le système devient **distribué**, **asynchrone**, ou s’étend sur plusieurs bases de données, les problèmes commencent : collisions d’identifiants, coordination nécessaire pour garantir l’unicité, complexité lors des fusions de données ou synchronisations inter-sites.
17+
18+
Les GUID (_Globally Unique IDentifiers_), quant à eux, peuvent être générés localement par l’application, sans dépendance à la base de données, tout en assurant une unicité quasi-absolue (2^128 combinaisons possibles).
19+
20+
## Nouveautés en .NET 9 : les GUID version 7
21+
22+
Depuis la version 9, .NET introduit la méthode `Guid.CreateVersion7()`, qui génère des GUID **ordonnables chronologiquement**. Cela répond à une critique historique des GUID : leur tendance à provoquer de la fragmentation dans les index SQL.
23+
24+
Les GUID v7 combinent un horodatage (48 bits) et des bits aléatoires.
25+
26+
On peut les utiliser avec :
27+
28+
```csharp
29+
Guid guid7 = Guid.CreateVersion7();
30+
```
31+
32+
Ces nouveaux GUID sont plus efficaces pour les insertions en base de données, car ils réduisent significativement les fragmentations d'index et offrent des performances comparables aux IDs séquentiels tout en conservant les avantages des GUID. Bien que EF Core ne les supporte pas encore nativement, il est possible de créer un générateur personnalisé pour les utiliser efficacement.
33+
34+
## Avantages des GUID dans un système distribué
35+
36+
* **Unicité globale** : pas besoin de coordination entre les bases de données ou les services.
37+
* **Génération côté client** : utile pour le mode hors-ligne, les tests ou les systèmes à haute disponibilité.
38+
* **Scalabilité** : pas de bottleneck sur une table centrale.
39+
* **Compatibilité avec la réplication** : les GUID sont idéaux pour la réplication multi-site.
40+
* **Facilite les tests automatisés** : permet de créer des identifiants prédictibles et stables entre exécutions.
41+
* **Uniformisation entre environnements** : les mêmes identifiants peuvent être utilisés en dev, test, staging ou production.
42+
43+
## Cas concrets
44+
45+
* **Fusion de deux bases de données** : sans GUID, risque de collision d’IDs.
46+
* **Microservices** : chaque service peut gérer ses propres identifiants.
47+
* **Tests automatisés** : avec des GUID prévisibles, les assertions et les fixtures deviennent plus stables.
48+
* **Alimentation entre environnements** : les mêmes GUID peuvent être utilisés pour des jeux de données identiques, simplifiant les déploiements.
49+
50+
## Implémentation en EF Core
51+
52+
```csharp
53+
public class Commande {
54+
public Guid Id { get; set; } = Guid.NewGuid();
55+
public string Description { get; set; } = "";
56+
}
57+
```
58+
59+
Pour utiliser un GUID séquentiel (côté SQL Server) :
60+
61+
```csharp
62+
modelBuilder.Entity<Commande>()
63+
.Property(c => c.Id)
64+
.HasDefaultValueSql("NEWSEQUENTIALID()");
65+
```
66+
67+
## Inconvénients des GUID
68+
69+
* Taille (16 octets vs 4 pour un `int`)
70+
* Moins lisibles pour les humains
71+
* Risque de fragmentation si non ordonnés
72+
* Légère surcharge en performance sur les jointures
73+
74+
## Dialogue avec les DBAs : trouver le bon équilibre
75+
76+
Tous les DBAs ne sont pas réfractaires au changement. Certains apportent même des solutions très pertinentes (index non cluster, fill factor adapté, etc.). Ce qu’ils attendent, c’est que les choix soient justifiés techniquement, mesurés, et documentés. Un DBA averti sera rassuré de savoir que vous utilisez des GUID **v7** plutôt que des GUID aléatoires classiques. Le dialogue avec eux permet de mettre en place une stratégie gagnant-gagnant.
77+
78+
## Sécurité des routes HTTP exposées
79+
80+
Un autre avantage souvent oublié : la **sécurité par l’obscurcité**.
81+
82+
Une route comme :
83+
84+
```
85+
GET /api/citoyens/5/enfants
86+
```
87+
88+
est prévisible. Un utilisateur malveillant peut tester `/6`, `/7`, etc., pour tenter d’accéder à des données qui ne lui sont pas destinées. C’est une attaque de type **IDOR (Insecure Direct Object Reference)**.
89+
90+
Avec des GUID :
91+
92+
```
93+
GET /api/citoyens/6f8d2ac1-3b90-4dc5-9543-f490a8f5d8c2/enfants
94+
```
95+
96+
l’exploration devient presque impossible sans information préalable. Attention : cela **ne remplace pas** une vérification des droits, mais cela constitue une **couche supplémentaire de protection**, conforme aux bonnes pratiques OWASP. Cela décourage aussi les attaques automatisées.
97+
98+
## Conclusion
99+
100+
Utiliser des GUID, ce n’est pas une mode. C’est une réponse technique à des besoins très concrets dans les architectures modernes. Il faut être conscient des implications (taille, fragmentation, lisibilité), mais avec les GUID **v7**, **les bonnes pratiques EF Core**, une **stratégie de tests solide**, et une **communication honnête avec vos DBAs**, ils peuvent devenir un atout puissant. Et dans un monde où la distribution, l’asynchronisme, les tests déconnectés, la sécurité et l’automatisation sont la norme, **c’est un choix de plus en plus stratégique**.
101+
102+
Bon coding, et que vos identifiants restent uniques !

0 commit comments

Comments
 (0)