Je suis novice dans les bases de données. J'ai lu et découvert que ce n'était probablement pas une bonne idée d'utiliser l'adresse e-mail comme clé primaire, car les comparaisons de chaînes sont plus lentes, ce qui affecte les performances dans les jointures complexes et si un e-mail change, je devrais changer toutes les clés étrangères, ce qui nécessite beaucoup. d'effort.
Mais si ma table d'utilisateurs requiert que chaque utilisateur ait une adresse e-mail et que chacune de ces adresses e-mail soit unique, l'ajout d'un index unique dans la colonne e-mail suffira-t-il? Parce que les champs uniques afaik autorisent les valeurs nulles, alors que j'exige que chaque utilisateur ait une adresse e-mail, n'autorisant pas les valeurs nulles. Y a-t-il quelque chose qui me manque ici? Ou je suis censé rendre la colonne e-mail unique et m'assurer lors de la validation des données sur le serveur que l'utilisateur entre une adresse e-mail afin que chaque utilisateur en ait une?
Réponses:
Distinguons d'abord les clés et les index, la clé fait partie du modèle logique et est souvent implémentée avec un index unique. Vous pouvez cependant créer un index unique sans créer de clé, mais qui ne peut pas être référencé par une clé étrangère.
Une clé candidate est quelque chose qui identifie de façon unique une ligne dans une table, en SQL, l'une des clés candidates est normalement utilisée comme clé primaire (je n'ai jamais vraiment compris pourquoi l'une des ck est considérée comme "meilleure" que les autres, mais c'est une autre histoire), et le ck restant devient des contraintes uniques.
Une contrainte unique peut être utilisée de la même manière qu'une clé primaire. Considérer:
B fait référence à la contrainte unique et C fait référence à la contrainte de clé primaire.
NOT NULL est encore un autre type de contrainte. Dans votre cas, vous pouvez appliquer cela pour le courrier électronique sans le déclarer unique.
Le prochain aspect de votre message concerne la stabilité d'une clé, une clé doit être stable (mais cela ne signifie pas qu'elle ne peut jamais changer, elle n'a pas besoin d'être immuable). Certains SGBD implémentent ON UPDATE CASCADE qui peuvent être utiles pour une telle opération, mais si la clé est distribuée autour de votre modèle, il sera difficile de la mettre à jour.
Dans votre cas, je choisirais probablement une autre clé candidate comme clé primaire et déclarerais que l'email n'est PAS NUL et UNIQUE.
la source
Oui, avoir un index unique sur la colonne EmailAddress devrait être correct. Le seul problème serait que si quelqu'un a abandonné l'adresse e-mail après s'être inscrit à votre service mais ne vous l'a pas dit, alors celui qui le propriétaire de l'adresse e-mail essaie de s'inscrire. Mais c'est un cas assez rare.
Quant à savoir si un index unique autorise des valeurs nulles qui dépendront de votre plate-forme de base de données. Oracle le fait, SQL Server autorise une seule valeur NULL. Vous pouvez résoudre ce problème en faisant en sorte que la colonne n'autorise pas les valeurs NULL, puis en construisant l'index unique dessus.
la source
where
clauses qui, par exemple, vous permettent d'exclure desNULL
valeurs de l'index.SQL Server allows a single NULL value
est toujours vraie. Il ne dit pas qu'il n'y a aucun moyen d'obtenir plusieursNULL
valeurs. Je pense que le répondeur essayait de garder la réponse simple et de ne pas expliquer les détails supplémentaires (comme filtré indexé).Avoir l'index unique sur EmailAddress est très bien.
Comme vous avez déjà indiqué qu'il y a une validation dans votre application pour avoir l'adresse e-mail comme champ obligatoire, je dirais que l'autre validation proviendrait de la base de données n'accepte pas un utilisateur sans adresse e-mail et empêche également la duplication d'entrées et ces validations sera imposé avec cet index unique.
Comme indiqué dans d'autres réponses pour SQL Server, vous devez faire en sorte qu'une colonne n'autorise pas la valeur nulle avant de créer des index uniques.
la source