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 pour Ceci j'ai créé un schéma comme celui-ci: p> p> ma question est la suivante: devrais-je utiliser des clés étrangères si oui pourquoi? P> p> p> admin code>. p> user_rols .User_id -> user.id code> p>
5 Réponses :
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])
)
Mot de passe et nom d'utilisateur est juste pour la démo, ce n'est pas un texte simple. Mon objectif est sur le système de rôle
Comment définir la clé primaire dans user_roles?
Pourquoi utiliser un user_roles code> Table d'association < / a> en premier lieu? Est la existence i> d'un users.id code> comme clé étrangère dans les rôles code> la table ne suffit pas?
@Jens: les utilisateurs peuvent être dans plusieurs rôles, les rôles peuvent avoir plusieurs utilisateurs? Votre suggestion signifierait «un utilisateur que par rôle»
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é. P>
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 à: p>
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). P>
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 p>
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:
Oui! B> Bien sûr, vous devriez avoir des clés étrangères. Pourquoi demandes-tu?? FK aide à assurer la cohérence des données b> - et sans FK, vous pouvez stocker tout type de
ID code> dans votreuser_roles code> 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!)