La spécification REST (quel que soit le niveau que vous souhaitez utiliser) n'a pas été conçue comme un accès à la base de données. Il essaie de normaliser l'accès à l'API. Les conventions SQL mentionnées (que vous souhaitiez les utiliser ou non) n'ont pas été conçues avec un accès API à l'esprit. Ils servent à écrire des requêtes SQL.
Donc, le problème à décompresser ici est la compréhension conceptuelle qu'une API mappe directement à la base de données. Nous pouvons trouver cela décrit comme un anti-modèle au moins aussi loin que 2009 .
La principale raison pour laquelle c'est mauvais? Le code décrivant "comment cette opération affecte-t-elle mes données?" devient le code client .
Cela a des effets assez terribles sur l'API. (liste non exhaustive)
Cela rend l'intégration avec l'API difficile
J'imagine les étapes pour créer un nouvel utilisateur documenté comme ceci:
POST /users { .. }
POST /usersettings { .. }
avec quelques valeurs par défaut
POST /confirmemails { .. }
Mais comment gérez-vous un échec de l'étape 2? Combien de fois cette même logique de manipulation est-elle copiée-collée à d'autres clients de votre API?
Ces opérations de données sont souvent plus faciles à séquencer côté serveur, tout en étant initiées à partir du client en une seule opération. Par exemple POST /newusersetup
. Les administrateurs de base de données peuvent reconnaître cela comme une procédure stockée, mais le fonctionnement de l'API peut avoir des effets au-delà de la base de données.
Sécuriser l'API devient un trou noir de désespoir
Disons que vous devez fusionner deux comptes d'utilisateurs.
GET /users/1
PUT /users/2 { .. }
DELETE /users/1
Comment allez-vous configurer une autorisation utilisateur pour autoriser la fonction de fusion sans autoriser la suppression de l'utilisateur? La suppression d'un utilisateur est-elle même équitablement représentée par DELETE /users/1
lorsqu'il /usersettings
existe également?
Les opérations d'API doivent être considérées comme des opérations de niveau supérieur (à celui de la base de données) qui peuvent entraîner plusieurs modifications dans le système.
L'entretien devient plus difficile
... car vos clients dépendent de la structure de votre base de données.
Sur la base de mon expérience avec ce scénario:
- Vous ne pouvez pas renommer ou supprimer des tables / colonnes existantes. Même lorsqu'ils ne sont pas nommés correctement pour leur fonction ou ne sont plus utilisés. Les clients vont se casser.
- Les nouvelles fonctionnalités ne peuvent pas modifier les structures de données existantes, de sorte que leurs données et fonctionnalités sont souvent séparées artificiellement même lorsqu'elles appartiennent globalement à une fonctionnalité existante.
- La base de code devient progressivement plus difficile à comprendre en raison de la fragmentation, des noms confus et des bagages restants qui ne peuvent pas être retirés en toute sécurité.
- Tous les changements, sauf insignifiants, deviennent de plus en plus risqués et prennent du temps.
- Le système stagne et est finalement remplacé.
N'exposez pas votre structure de base de données directement aux clients ... en particulier les clients sur lesquels vous n'avez pas de contrôle de développement. Utilisez une API pour limiter le client à des opérations uniquement valides.
Donc, si vous utilisez une API comme une simple interface directement dans une base de données, la pluralisation est le moindre de vos soucis. Pour autre chose qu'une expérience jetable, je suggérerais de passer un peu de temps à déterminer les opérations de niveau supérieur que l'API devrait représenter. Et lorsque vous regardez les choses de cette façon, il n'y a pas de conflit entre les noms d'entités API pluralisés et les noms d'entités SQL singuliers. Ils sont là pour différentes raisons.