2 votes

Adéquation de l'ID d'identité AWS Cognito pour la clé primaire SQL

Je travaille sur une plateforme où les ID utilisateur uniques sont des ID d'identité d'un pool d'identités Amazon Cognito. Qui ressemblent à ceci : "us-east-1:128d0a74-c82f-4553-916d-90053e4a8b0f"

La plateforme dispose d'une base de données MySQL qui contient une table d'éléments que les utilisateurs peuvent consulter. J'ai besoin d'ajouter une table de favoris qui contient chaque élément favori de chaque utilisateur. Cette table pourrait potentiellement contenir des millions de lignes.

La structure de la table 'favoris' ressemblerait à ceci :

userID, itemID, dateAdded

où l'userID et l'itemID ensemble forment une clé primaire composite.

Je comprends que ce type d'userID (pratiquement un UUID étendu, qui doit être stocké en tant que char ou varchar) offre de mauvaises performances en termes d'indexation. Donc l'utiliser comme clé ou index pour des millions de lignes est déconseillé.

Ma question est : Ma compréhension est-elle correcte, et devrais-je m'inquiéter des performances à l'avenir en raison de cette clé ? Y a-t-il des mesures que je peux prendre pour réduire les risques de performance ?

Mes connaissances globales en base de données ne sont pas excellentes, donc si c'est un gros problème...Déplacer la liste de favoris vers une table NoSQL (où l'userID en tant que clé permettrait un temps d'accès constant), et récupérer un tableau d'ID d'éléments favoris, à utiliser dans une requête SELECT...WHERE IN, serait-il une alternative acceptable ?

Merci beaucoup !

4voto

Seyed Points 1215

D'accord, donc ici je veux expliquer pourquoi ceci n'est pas bon, l'alternative, et le flux de travail de lecture/écriture de votre application.

Pourquoi pas : ce n'est pas une bonne architecture car si quelque chose arrive à votre pool d'utilisateurs Cognito, vous ne pouvez pas le repeupler avec les mêmes identifiants pour chaque utilisateur individuel. De plus, Cognito est désormais proposé dans plus de régions ; comparé à l'année dernière. Disons que votre base d'utilisateurs se trouve en Indonésie, et maintenant que Cognito est disponible à Singapour ; vous voulez déplacer vos pools d'utilisateurs de Tokyo à Singapour ; en raison du problème de latence ; non seulement vous avez le problème de déplacer les utilisateurs ; vous avez également le problème de peupler votre base de données ; donc votre approche manque de scalabilité, maintenabilité et casse le principe de responsabilité unique (mettre à jour Cognito nécessite de mettre à jour la base de données et vice versa).

Solution alternative : laissez l'index de la base de données appartenir au domaine de la base de données ; et utilisez le nom d'utilisateur comme lien entre votre base de données et votre pool d'utilisateurs Cognito. Donc :

Le flux de travail de lecture sera :

  1. Authentification de l'utilisateur : l'utilisateur s'authentifie et obtient le jeton.

  2. Votre application vérifie le jeton, et à partir de ses données, obtient le nom d'utilisateur.

  3. Votre application contacte la base de données et obtient les informations de l'utilisateur, en se basant sur le nom d'utilisateur.

  4. Votre application amène l'utilisateur sur sa page et fournit les informations stockées dans la base de données.

Le flux de travail de écriture sera :

  1. Votre application reçoit la demande d'écriture avec l'utilisateur et le jeton.

  2. Vérifie le jeton.

  3. Écrit dans la base de données en se basant sur le nom d'utilisateur unique.

2voto

Ashan Points 119

En ce qui concerne MySQL, si vous utilisez le composite UserID et CognitoID pour la clé primaire, cela a un impact négatif sur les performances des requêtes et n'est donc pas recommandé pour un grand ensemble de données.

Cependant, l'utilisation de ceci ou même de UserID pour NoSQL DynamoDB est plus appropriée à moins que vous n'ayez des requêtes complexes. Vous pouvez également renforcer la sécurité avec le contrôle d'accès fin-grained AWS DynamoDB en se connectant à Cognito Identity Pools.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X