web-dev-qa-db-fra.com

Les ID backend doivent-ils être publics ou non sur une API REST?

Basé sur ce que dit ce type: http://toddfredrich.com/ids-in-rest-api.html

Supposons qu'il ait raison d'utiliser UUID pour identifier les ressources de l'API. Ensuite, je rencontre des problèmes pour essayer de l'implémenter de cette façon, c'est:

class FooEntity {

    final String id = null;  //auto-generated by my backend (mongodb), not shared
    final UUID uid = UUID.randomUUID();  //the resource id
}

(Entre le client et le serveur, les DTO sont envoyés et reçus, pas les entités de base de données.)

Le problème est maintenant que id n'est pas utile car je ne l'utilise plus. Le client fait les demandes avec uid alors pourquoi est-ce que je me donne la peine de gérer 2 id? Ensuite, nous revenons à la même question du début. Si je définis UUID comme clé primaire (_id) alors j'expose l'id du backend au public.

À côté de cela, il y a le sujet de l'efficacité. J'ai lu que l'indexation par ObjectId est beaucoup plus efficace que UUID.

14
anat0lius

J'expose l'ID du backend au public

De quels autres moyens disposez-vous pour identifier vos entités lors de leur retour via une demande? C'est parfaitement légitime et plus sûr que le SSN ou des identifiants similaires. C'est ce dont parle Todd - rendre la technologie d'identification et l'entité neutres et il a raison.

Sujet efficacité

Vous pouvez conserver les deux identifiants si ObjectId est vraiment beaucoup plus efficace. Théoriquement, il vaut toujours mieux tiliser les UUID pour les identifiants que les incrémenteurs automatiques de base de données.

7
civan

Non, en ce qui concerne la base de données, rien sur la structure interne n'est exposé à l'API externe. Les pièces d'identité n'ont aucune intelligence. Ils ne sont même pas uniques dans le monde réel. ID: 47 est partout. Il y a des entités auxquelles vous avez accès et que vous pouvez éventuellement manipuler les données, mais que cette base de données stocke tout dans une table ou dix, utilise un ID incrémentiel comme PK et se rapporte à un FK, vous ne le saurez jamais.

Si vous le pouvez, GetUserAccountByID (12345) demande simplement à quelqu'un d'essayer GetUserAccountByID (12346). Même si cela ne fonctionnera pas en raison d'autres mesures de sécurité, n'essayez même pas et n'essayez pas de pirater la société en demandant des informations sur le compte: 12346. Sauf si vous appelez le DBA et êtes prêt à attendre 2 semaines pour un réponse;)

Créez donc les GUID comme bon vous semble ou toute autre clé naturelle comme un numéro de téléphone ou une adresse e-mail. Mettez une contrainte unique sur le champ dans la table pour éviter une tentative de copier-coller obscure lors d'une tentative de fusion de données.

Ce n'est pas redondant. Les deux domaines ont des objectifs différents.

5
JeffO

À propos de l'efficacité ID vs UUID, sauf si vous avez plusieurs jointures impliquant plusieurs tables ayant chacune des millions d'enregistrements, cela ne fera pas beaucoup de différence. L'utilisation de l'UUID rend votre application beaucoup plus difficile à supprimer si vous ne cochez pas/n'appliquez pas directement sur le côté serveur:

  • OBTENIR [...]/1
  • OBTENIR [...]/2

C'est très facile lorsque vous utilisez ID, si vous utilisez UUID à la place, c'est une option de moins pour un scrapper.

L'ID peut être considéré comme quelque chose d'internes à l'instance de base de données de votre application. Il y a trois mots importants dans cette phrase:

  • Application: puisque c'est votre modèle, il est probable que vos tables ne soient utilisées que par cette application
  • Base de données: si plusieurs applications l'utilisaient contre la même base de données, tout va bien
  • Instance (de la base de données): si vous avez un système distribué, id se confondra entre eux, et ils n'auraient aucun sens pour tout autre système/application qui n'utilise pas l'instance de votre base de données. UUID est la solution pour ce cas spécifique.

Sur une préférence personnelle: je préfère avoir un identifiant simple et un identifiant professionnel unique (mail, login, ...). Donc, si je dois échanger des données, j'utiliserai l'ID d'entreprise, car le système cible peut ne pas gérer l'UUID, mais il va très probablement (ne jamais dire jamais ...) gérer correctement une clé d'entreprise unique.

0
Walfrat