De décider entre une artificielle clé primaire et une clé naturelle pour les Produits de la table
En gros, j'ai besoin de combiner les données de produits auprès de fournisseurs multiples dans une seule base de données (c'est plus complexe que ça, bien sûr) qui a plusieurs tables qui doivent être réunis pour la plupart des OLTP opérations.
J'allais coller avec la valeur par défaut et utiliser l'auto-incrémentation entier comme la clé primaire, mais alors que l'un fournisseur de fournitures de leurs propres "ProductiD" sur le terrain, le reste ne le font pas et je dois faire beaucoup de manuel de la cartographie pour les autres tables pour charger les données (que je dois d'abord le charger dans la table Produits, puis tirez sur l'ID de sortir et d'ajouter qu'avec les autres informations dont j'ai besoin pour les autres tables).
Sinon, je pourrais utiliser le produit SKU que c'est la clé primaire depuis le SKU est unique pour un seul produit, et tous les vendeurs de fournir un SKU dans leurs flux de données. Si j'utilise le SKU comme le PK alors je pourrais facilement en charge les flux de données, comme tout est basé sur de la référence, qui est de savoir comment il fonctionne dans le monde réel. Cependant le SKU est alphanumérique et sera probablement un peu moins efficace qu'un entier clés.
Des idées sur ce que je dois regarder?
Vous devez vous connecter pour publier un commentaire.
C'est un choix entre la mère porteuse et naturel des clés primaires.
À mon humble avis toujours en faveur de la mère porteuse des clés primaires. Les clés primaires ne devriez pas avoir de sens parce que le sens peut changer. Même les noms de pays peuvent changer et les pays peuvent venir à l'existence et disparaître, sans parler des produits. Modification des clés primaires est certainement pas conseillé, ce qui peut arriver avec des clés naturelles.
Plus sur de substitution vs les clés primaires:
Et il y a aussi Les Clés de substitution vs Naturelles Clés pour Clé Primaire?
Dans le meilleur des cas, je recommande toujours la clé de substitution.
Il vous donne des options pour l'avenir, et vous protège contre des inconnus.
Il n'y a pas de raison de touches supplémentaires, comme un SKU, ne pouvait pas être fait de la non-nulle pour les faire appliquer, mais au moins, par la suppression de votre dépendance à l'égard des tiers que vous vous donnez la possibilité de choisir, plutôt que de l'avoir pris auprès de vous et durable douloureuse de réécriture à un stade ultérieur.
Si vous optez pour l'auto-incrémenté entier ou de déterminer la prochaine clé primaire-vous, il y aura des complications. Avec l'auto-incrémenté méthode, vous pouvez insérer l'enregistrement facilement et de le laisser affecter sa propre clé, mais vous pouvez avoir de la difficulté à identifier exactement ce que la clé de votre dossier a été donné (et obtenir le max n'est pas garanti de retour le vôtre).
J'ai tendance à aller pour les auto-attribué clé parce que vous avez plus de contrôle et, dans sql server, vous pouvez récupérer vos clés à partir d'un centre des clés de la table et de s'assurer que personne d'autre ne l'obtient de la même clé, le tout dans une seule instruction:
Les enregistrements de la table de la dernière clé utilisée. Sql ci-dessus incréments clé directement dans le tableau, et renvoie la nouvelle clé, ce qui garantit son unicité.
Pourquoi vous devez éviter de alphanumérique clés primaires:
Trois problèmes principaux: la performance, de classement et de l'espace.
La Performance il y a un coût de performance, comme les Razzie ci-dessous, je ne peux pas citer tous les numéros, mais il est moins efficace de l'indice de caractères alphanumériques que des chiffres.
Classement de vos développeurs peuvent créer la même clé avec différents classements dans les différentes tables (ça arrive), ce qui entraîne en permanence à l'aide de la "rassembler" les commandes lors de l'assemblage de ces tables, des requêtes et qui vieillit très rapidement.
Espace - neuf-personnage SKU comme David prend neuf octets, mais un nombre entier ne prend que quatre (2 pour smallint, 1 pour tinyint). Même un bigint ne prend que 8 octets.
Les dangers toujours présents avec des clés naturelles, c'est que vos hypothèses de départ sera tort maintenant ou dans l'avenir, lorsque certains changements sont effectués à l'extérieur de votre contrôle, ou à un certain endroit, vous aurez besoin de faire référence à un enregistrement dans lequel le passage d'un secteur déterminant n'est pas souhaité (ex. une application web qui utilise un employé du numéro de sécurité sociale comme clé primaire, et ensuite utiliser des url comme /employé.le php?le ssn=xxxxxxx)
À partir de ma propre expérience personnelle avec le nom "uniques" SKU et fournisseur de flux de données - êtes-vous absolument sûr ils vous envoient un flux complet, unique, bien formé Références?
J'ai eu personnellement à faire face à tous les éléments suivants lors de l'obtention d'aliments de fournisseurs qui ont des niveaux variables de la TI et de bureau de la compétence:
Je voudrais aussi aller avec une incrémentation automatique de la clé primaire. L'impact sur les performances pour avoir une alphanumérique de clé primaire sont là, bien que je n'ose pas le nom de tous les numéros. Toutefois, si la performance est importante dans votre application, raison de plus pour y aller avec l'auto-incrémentation colonne de clé primaire.
J'aimerais avoir des conseils sur un autoincremented "vide de sens" entier comme clé primaire. Quelqu'un devrait venir avec l'idée de la réorganisation des Id de produit, au moins votre DB n'aurez pas de problèmes.
Assez similaire à ma question il y a quelques mois...
Si j'ai un dédié champ de clé primaire?
Je suis allé avec une incrémentation automatique PK à la fin.
Puisque vous avez à traiter avec des données provenant de plusieurs fournisseurs en dehors de votre contrôle, je voudrais utiliser une clé de substitution. Vous ne voulez pas avoir à rearchitect votre conception de base de données, un jour, lorsque l'un d'entre eux arrive à vous envoyer un duplicata.
Une clé de substitution (auto increment champ INT) permettra d'identifier de manière unique une ligne dans la table. D'autre part, un environnement Naturel Unique de la clé (productName) permettra d'éviter de dupliquer des données de produit d'entrer dans le tableau.
Avec un Naturel unique champ de clé, deux lignes ou plus ne peut jamais avoir les mêmes données.
Avec une clé de substitution champ, les Lignes peuvent être unique en raison de l'incrément automatique INT terrain, mais les données en lignes ne sera pas unique, car la clé de substitution n'a aucun rapport avec les données.
Prenons l'exemple d'un Utilisateur de la table, la table Naturel du champ de la clé (nom d'utilisateur) permettra d'éviter même l'utilisateur à partir de l'enregistrement deux fois, mais l'auto incrément champ INT (userId) ne sera pas.
Si chaque produit aura un SKU et le SKU est unique pour chaque produit, je ne vois pas pourquoi vous ne voulez pas l'utiliser pour une possible clé primaire.
Vous pouvez toujours prendre un de hachage de la référence qui pourrait se débarrasser des alphas. Vous avez le code pour d'éventuelles collisions (qui doit être très rare) qui est une complication supplémentaire.
J'utilise le hachage pour remplir la clé primaire et de faire de l'importation initiale facile, mais lorsque vous l'utilisez dans la base de données toujours à la traiter comme si c'était un nombre au hasard. De cette façon, la clé primaire perdra de son sens (et de tous les avantages d'une auto-incrémenté touche) permettant une certaine souplesse dans l'avenir.