Garder l'utilisateur et le profil utilisateur dans des tableaux différents?


26

J'ai vu dans quelques projets que les développeurs préfèrent conserver les informations utilisateur essentielles dans une table (e-mail / connexion, hachage du mot de passe, nom d'écran) et le reste du profil utilisateur non essentiel dans une autre (date de création, pays, etc.). Par non essentiel, je veux dire que ces données ne sont nécessaires qu'occasionnellement. L'avantage évident est que si vous utilisez ORM, interroger moins de champs est évidemment bon. Mais alors vous pouvez avoir deux entités mappées sur la même table et cela vous évitera d'interroger des choses dont vous n'avez pas besoin (tout en étant plus pratique). Quelqu'un connaît-il un autre avantage à conserver ces choses dans deux tableaux?



1
@MichaelT merci! Il est intéressant de noter qu'il n'y a pas de consensus sur toutes les questions liées.
Andrey

C'est pourquoi je suis allé avec la liste des questions liées plutôt que d'essayer d'y répondre moi-même. Cela se résume vraiment au cas par cas et à la façon dont une application particulière est architecturée. N'oubliez pas que vous pouvez toujours utiliser une vue pour rapprocher les deux bits si nécessaire. Envisagez également la possibilité de dissocier l'un (suppression du compte), mais de conserver l'autre (les questions doivent être liées à un compte, mais le compte n'a pas toujours de profil ...). Ce pourrait être une question intéressante à lancer dans le chat de génie logiciel ou à se diriger vers DBA.SE et à demander dans leur chat.

1
@MichaelT Je pense à créer une sorte de cadre généralisé qui fournira un modèle utilisateur.
Andrey

Dans certains projets antérieurs, j'ai délibérément déplacé des colonnes qui devaient être écrites très fréquemment dans leurs propres tables distinctes dans le but de protéger la table principale au cas où le fichier de base de données serait corrompu ou endommagé.
GrandmasterB

Réponses:


11

Cela dépend de la taille et des exigences de votre projet.

Je peux voir une façon dont les données sur les utilisateurs peuvent être divisées en deux ensembles, avec des objectifs différents et donc des exigences:

  • Données d'identité: nom d'utilisateur, hachage du mot de passe, adresse e-mail, dernière heure de connexion, etc.
  • Données de profil utilisateur, qui incluent les préférences des utilisateurs, la dernière activité, les mises à jour de statut, etc.

Notez qu'il existe certains attributs concernant l'utilisateur qui peuvent appartenir à l'une ou l'autre catégorie (par exemple la date de naissance de l'utilisateur). La différence entre ces deux ensembles est cependant que le premier est étroitement contrôlé et que ce n'est qu'à travers certains workflows qu'il peut être modifié. Par exemple, la modification d'un mot de passe peut nécessiter la fourniture d'un mot de passe existant, la modification de l'e-mail peut nécessiter une vérification de l'e-mail, et il serait utilisé dans le cas où l'utilisateur oublie le mot de passe.

Les préférences ne nécessitent pas de telles ACL et pourraient théoriquement être modifiées par l'utilisateur ou une autre application tant que l'utilisateur y consent. Les enjeux sont faibles si une application malveillante ou due à un bogue corrompt les données ou tente de les modifier (en supposant que d'autres mesures de sécurité soient prises.) Cependant, il serait généralement désastreux si l'un des nom d'utilisateur, mot de passe ou e-mail pouvait être modifié. car ils peuvent être utilisés pour assumer l'identité de l'utilisateur ou refuser le service ou entraîner des frais de support, etc. pour l'administrateur.

Ainsi, les données sont généralement stockées dans deux types de systèmes:

  • Les données d'identité iront généralement dans un répertoire ou une solution IAM.
  • Les données de préférence se retrouveront dans une base de données.

Cela dit, dans la pratique, les gens enfreindront ces règles et utiliseront l'un ou l'autre (par exemple, le serveur SQL derrière le fournisseur d'adhésion ASP.NET).

À mesure que les données d'identité deviennent plus grandes ou que l'organisation qui les utilise augmente, différents types de problèmes se glissent. Par exemple, dans le cas d'un répertoire, il tentera de répliquer les modifications de mot de passe immédiatement sur tous les serveurs dans un environnement multiserveur. Cependant, la préférence de l'utilisateur ne nécessite qu'une cohérence éventuelle. (Pour info: les deux sont des optimisations différentes du théorème CAPS.)

Enfin, les répertoires (en particulier les répertoires en ligne / cloud) émettront également des jetons d'accès pour d'autres ressources en utilisant des protocoles tels que OAUTH (par exemple, pensez à Facebook, Google, Microsoft Account, ADFS), tandis qu'une base de données n'a pas un tel besoin. Une base de données prendra en charge des jointures et une structure de requête assez complexes, dont le répertoire n'a pas besoin.

Pour plus de détails, quelques recherches sur le répertoire d'identité par rapport à la base de données seraient utiles.

Il se résume finalement à ce que vos scénarios sont et devraient être à l'avenir, y compris l'intégration avec des tiers (et ce qu'ils utilisent). Si c'est un projet bien contenu et que vous êtes sûr que vous pouvez sécuriser les données d'identité de l'utilisateur et vous authentifier correctement, vous pouvez opter pour la base de données. Sinon, il pourrait être utile d'étudier un répertoire d'identité.

Si vous optez pour la DB, IMO, l'utilisation d'une DB contre deux reviendrait finalement au contrôle d'accès, à la fois pour les utilisateurs et les applications.


3

Il y a au moins trois cas où il est souhaitable d'avoir une table personne pour les attributs de base et une deuxième table pour les autres attributs avec une relation un-à-un:

  • Données BLOB comme une image. Une table distincte permet de stocker les données séparément pour des raisons de performances, par exemple dans un espace table séparé.
  • Des données qui ne s'appliquent pas à tout le monde ou qui ne s'appliquent qu'à une personne jouant un certain rôle. Considérez-le comme des colonnes qui seraient nulles sur de nombreuses lignes si elles faisaient partie de la table principale.Dans la base de données d'une clinique, vous pouvez avoir une table de personne, une table de patient et une table de médecin, dans la première vous auriez des attributs de base, dans la seconde seulement des attributs pertinents lorsque la personne est un patient comme une couverture d'assurance, dans le troisième tableau (lorsque la personne est un médecin), vous pourriez avoir la spécialité médicale et d'autres données qui ne s'appliquent qu'au personnel médical. De toute évidence, un médecin peut être un patient.
  • Un tableau qui matérialise une relation avec une entité dans un système distant. Dans ce cas, le tableau établit une équivalence entre des identifiants uniques dans une base de données distincte pour des raisons d'interopérabilité.

Je pense que le cas que vous exposez s'inscrit dans le deuxième cas.


1

Ma principale raison de les garder séparés est d'essayer d'éviter ce qui est connu dans la programmation orientée objet comme une «classe divine». Les ORM associent les tables et les champs aux classes et aux attributs, de sorte qu'il devient également pertinent au niveau SQL (même sans ORM, un principe similaire est généralement en jeu).

La classe Utilisateur (et par association la table utilisateur) est souvent la table qui devient la classe divine avec des centaines d'attributs / champs, des dizaines ou des centaines de méthodes et une définition de classe (pour les méthodes) de plus de 1000 lignes. J'ai tout vu. Plus d'une fois.

La séparation de l'utilisateur tente donc de résoudre ce problème. Il peut y avoir une personne, un utilisateur, un compte et la séparation des préoccupations peut sembler un peu artificielle, mais il s'agit d'essayer d'éviter la complexité et de s'assurer que chaque objet ne concerne qu'un aspect des données.


2
Même une classe d'utilisateurs gonflée n'est toujours pas nécessairement une classe divine. Il peut être gonflé de logique liée à l'utilisateur (ce qui peut se compliquer dans les grands projets), mais s'il n'intègre pas de logique non liée, je ne vois pas de gros problème. Je ne sais pas comment la division d'une classe en 2 résoudra ledit problème de classe divine.
Andrey
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.