8
votes

Comment concevoir un schéma utilisateur / rôle dans une base de données SQL Server?

Je veux concevoir un système utilisateur / rôle:

Les utilisateurs ont un nom et un mot de passe, puis l'utilisateur peut avoir plusieurs rôles tels que admin .

pour Ceci j'ai créé un schéma comme celui-ci:

Utilisateurs: xxx

xxx

user_roles: xxx

ma question est la suivante: devrais-je utiliser des clés étrangères user_rols .User_id -> user.id

si oui pourquoi?


1 commentaires

Oui! Bien sûr, vous devriez avoir des clés étrangères. Pourquoi demandes-tu?? FK aide à assurer la cohérence des données - et sans FK, vous pouvez stocker tout type de ID dans votre user_roles Tableau - sans vérifier si ceux-ci sont valables utilisateurs et / ou rôles - pas quelque chose que vous voulez faire (et non quelque chose que vous voulez avoir à nettoyer plus tard!)


5 Réponses :


10
votes

Pas tout à fait sûr de ce que vous voulez dire, mais ...

  • user_roles code> doit avoir 2 colonnes uniquement user_id code> et rôle_id code>
    Ces deux forment la clé primaire li>
  • Vous n'avez pas besoin d'une colonne d'identifiant supplémentaire user_roles code> li>
  • user_id code> est une clé étrangère sur users.id code> li>
  • rôle_id code> est une clé étrangère à roles.id code> li> ul>

    EDIT: Maintenant, je comprends. Oui, Utilisez toujours des touches étrangères p>

    aussi ... p>

    • Si mot de passe code> est nvarchar (50) code>, cela implique un texte brut. C'est mauvais em>. li>
    • Si vous avez dupliquer Nom code> Valeurs dans utilisateurs code>, comment savez-vous quel utilisateur est lequel est lequel est?
      Surtout s'ils ont le même mot de passe (ce qui se produira parce que nous, les viandes sont stupides) li> ul>

      Modifier après commentaire après la création principale de la clé ... P>

      CREATE TABLE [dbo].[User_Roles]
      (
          [User_id] [int] NOT NULL,
          [Role_id] [int] NOT NULL,
      
          CONSTRAINT [PK_User_Roles] PRIMARY KEY CLUSTERED ([User_id], [Role_id]),
          CONSTRAINT [UQ_ReversePK] UNIQUE ([Role_id], [User_id])
      )
      



0
votes

Utilisez toujours des clés étrangères lorsque les modèles de données ont une relation. Dans votre échantillon, si vous ne créez pas les clés étrangères, rien ne vous empêche (ou une autre personne ayant accès à la base de données) de la suppression par erreur (ou délibérément) un rôle actuellement utilisé.

Disons que vous avez de nombreux utilisateurs et quelques rôles. L'un des rôles est appelé «admin» et est requis dans votre demande afin de faire des tâches. Si vous n'avez pas la configuration des clés étrangères, il n'y a rien dans la base de données pour empêcher une personne de supprimer le rôle administrateur, de détecter votre demande à:

  • probablement crash car il cherchera un rôle qui n'est plus dans la base de données
  • Si ce n'est pas ce qui précède, au moins aucun utilisateur n'aura que le rôle de «administrateur», fermez les parties de l'application où elle est requise

    Si, sur la main, vous avez configuré les clés étrangères, vous recevrez une erreur de la base de données si vous essayez de supprimer un rôle qui est actuellement attribué à un utilisateur (via la table User_Roles).


0 commentaires


0
votes

Une des meilleures approches qui sont légèrement différentes de @gbn seront également:

J'espère que cela vous aide à vous aider ou à quelqu'un d'autre xxx


0 commentaires

0
votes

La table Utilisateurs_Roles doit contenir la cartographie entre chaque utilisateur et leurs rôles. Chaque utilisateur peut avoir de nombreux rôles et chaque rôle peut avoir de nombreux utilisateurs: xxx


0 commentaires