La normalisation de vos tables opérationnelles comme suggéré par Transact Charlie est une bonne idée et vous évitera de nombreux maux de tête et problèmes au fil du temps - mais il existe des éléments tels que les tables d' interface , qui prennent en charge l'intégration avec des systèmes externes, et les tableaux de rapport , qui prennent en charge des choses comme l'analyse En traitement; et ces types de tableaux ne doivent pas nécessairement être normalisés - en fait, très souvent, il est beaucoup, beaucoup plus pratique et performant pour eux de ne pas être .
Dans ce cas, je pense que la proposition de Transact Charlie pour vos tables opérationnelles est bonne.
Mais j'ajouterais un index (pas nécessairement unique) à CompetitorName dans la table Competitors pour prendre en charge des jointures efficaces sur CompetitorName à des fins d'intégration (chargement de données à partir de sources externes), et je mettrais une table d'interface dans le mélange: CompetitionResults.
Les résultats de la compétition doivent contenir toutes les données de vos résultats de compétition. Le but d'une table d'interface comme celle-ci est de rendre aussi rapide et facile que possible la tronquer et la recharger à partir d'une feuille Excel ou d'un fichier CSV, ou quelle que soit la forme dans laquelle vous avez ces données.
Cette table d'interface ne doit pas être considérée comme faisant partie de l'ensemble normalisé de tables opérationnelles.Ensuite, vous pouvez vous joindre à CompetitionResults comme suggéré par Richard, pour insérer des enregistrements dans des concurrents qui n'existent pas déjà, et mettre à jour ceux qui existent (par exemple si vous avez réellement plus d'informations sur les concurrents, comme leur numéro de téléphone ou leur adresse e-mail).
Une chose que je voudrais noter - en réalité, il me semble que le nom du concurrent est très peu susceptible d'être unique dans vos données . Dans 200 000 concurrents, vous pouvez très bien avoir 2 David Smith ou plus, par exemple. Je vous recommande donc de collecter plus d'informations auprès des concurrents, telles que leur numéro de téléphone ou une adresse e-mail, ou quelque chose qui est plus susceptible d'être unique.
Votre table opérationnelle, Concurrents, doit avoir une seule colonne pour chaque élément de données qui contribue à une clé naturelle composite; par exemple, il doit avoir une colonne pour une adresse e-mail principale. Mais la table d'interface doit avoir un emplacement pour l' ancien et le nouveau valeurs pour une adresse e-mail principale, afin que l'ancienne valeur puisse être utilisée pour rechercher l'enregistrement dans Concurrents et mettre à jour cette partie avec la nouvelle valeur.
Donc CompetitionResults devrait avoir quelques champs "anciens" et "nouveaux" - oldEmail, newEmail, oldPhone, newPhone, etc. De cette façon, vous pouvez former une clé composite, dans Competitors, à partir de CompetitorName, Email et Phone.
Ensuite, lorsque vous avez des résultats de compétition, vous pouvez tronquer et recharger votre table CompetitionResults à partir de votre feuille Excel ou de tout ce que vous avez, et exécuter une seule insertion efficace pour insérer tous les nouveaux concurrents dans la table des concurrents, et une mise à jour unique et efficace pour mettre à jour toutes les informations sur les concurrents existants à partir des résultats du concours. Et vous pouvez faire une seule insertion pour insérer de nouvelles lignes dans le tableau CompetitionCompetitors. Ces opérations peuvent être effectuées dans une procédure stockée ProcessCompetitionResults, qui pourrait être exécutée après le chargement de la table CompetitionResults.
C'est une sorte de description rudimentaire de ce que j'ai vu faire à maintes reprises dans le monde réel avec Oracle Applications, SAP, PeopleSoft et une longue liste d'autres suites logicielles d'entreprise.
Un dernier commentaire que je ferais est celui que j'ai déjà fait sur SO: Si vous créez une clé étrangère qui garantit qu'un concurrent existe dans la table des concurrents avant de pouvoir ajouter une ligne avec ce concurrent à CompetitionCompetitors, assurez-vous que la clé étrangère est définie pour mettre en cascade les mises à jour et les suppressions . De cette façon, si vous devez supprimer un concurrent, vous pouvez le faire et toutes les lignes associées à ce concurrent seront automatiquement supprimées. Sinon, par défaut, la clé étrangère vous demandera de supprimer toutes les lignes associées de CompetitionCompetitors avant de vous permettre de supprimer un concurrent.
(Certaines personnes pensent que les clés étrangères non en cascade sont une bonne précaution de sécurité, mais mon expérience est qu'elles sont juste une douleur effrayante dans les fesses qui sont le plus souvent simplement le résultat d'un oubli et qu'elles créent un tas de travail pour les administrateurs de base de données. Le fait que des personnes suppriment accidentellement des éléments est la raison pour laquelle vous avez des boîtes de dialogue "êtes-vous sûr" et divers types de sauvegardes régulières et de sources de données redondantes. Il est beaucoup plus courant de vouloir supprimer un concurrent, dont les données sont toutes foiré par exemple, c'est d'en supprimer accidentellement un puis de dire "Oh non! Je ne voulais pas faire ça! Et maintenant je n'ai pas leurs résultats de compétition! Aaaahh!" Ce dernier est certainement assez courant, donc , vous devez y être préparé, mais le premier est beaucoup plus courant,Donc, le moyen le plus simple et le meilleur de se préparer à l'ancien, imo, est simplement de faire en sorte que les clés étrangères mettent en cascade les mises à jour et les suppressions.)
NVARCHAR(64)
colonne votre clé primaire (et donc: clustering) !! Tout d'abord - c'est une clé très large - jusqu'à 128 octets; et deuxièmement, sa taille est variable - encore une fois: pas optimale ... C'est à peu près le pire choix que vous puissiez avoir - vos performances seront d'enfer, et la fragmentation des tables et des index sera à 99,9% tout le temps .....