2 votes

String comme clé primaire ?

J'ai la structure de base de données suivante

CREATE TABLE `productinfo` (
  `ProductID` int(11) NOT NULL AUTO_INCREMENT,
  `ProductName` varchar(255) NOT NULL,
  `ProductImage` varchar(255) NOT NULL,
  `CategoryID` int(11) NOT NULL,
  `SubCategoryID` int(11) NOT NULL,
  `ProductBrief` varchar(255) NOT NULL,
  `Features` text NOT NULL,
  `Specifications` text NOT NULL,
  `Reviews` text NOT NULL,
  `Price` varchar(255) NOT NULL,
  `Status` tinyint(4) NOT NULL,
  PRIMARY KEY (`ProductID`)
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=latin1;

Je dois maintenant transformer ProductID, CategoryID et SubCategoryID en une chaîne de caractères comme Ps-5678 pour le numéro de pièce. ProductID est la clé primaire, alors comment puis-je changer la structure de la base de données. CategoryID et SubCategoryID sont des clés primaires dans d'autres tables, alors comment puis-je gérer cela ?

  `ProductID` int(11) NOT NULL AUTO_INCREMENT

dans une chaîne et se débarrasser de

  PRIMARY KEY (`ProductID`)

idées, suggestions, tout le monde

8voto

Raj More Points 22358

Les clés primaires sont destinées à la base de données.

Les noms d'affichage sont destinés aux utilisateurs finaux.

Ne confondez pas l'un avec l'autre ! Ne faites pas une clé primaire d'un élément qui a une signification. Vous le regretterez tôt ou tard.

Avoir une clé de substitution / identité / numéro automatique comme clé primaire est une très bonne idée et est largement utilisé dans la conception de bases de données.

Vous pouvez ajouter une colonne ou même une COLONNE DERIVÉE et y ajouter une contrainte unique.

1voto

Je pense que cela devrait être aussi simple que cela. Cependant, vous devez déterminer le type de chaîne que vous voulez utiliser. http://dev.mysql.com/doc/refman/5.1/en/string-types.html

1voto

PerformanceDBA Points 9613

Votre exigence n'est pas claire. Comment obtenez-vous "PS-5678" à partir de 3 colonnes int ? Il n'y a que 2 composants dans votre exemple.

Avez-vous simplement besoin de CONVERTIR les 3 INT en une seule chaîne CHAR() ?

Si c'est le cas, la base de données est parfaite, il n'est pas nécessaire de modifier la table ! Les trois composantes sont déjà disponibles, correctement séparées, en tant que colonnes distinctes. Ce que vous recherchez, c'est simplement d'AFFICHER les trois composants comme une seule chaîne.

0voto

Jay Points 14781

Votre question n'est pas très claire : que faites-vous du produit, de la catégorie et de la sous-catégorie pour obtenir votre numéro de pièce ? Je supposerai, pour les besoins de l'argumentation, que vous les concaténiez ensemble, comme le produit 123, la catégorie 456, la sous-catégorie 789 donnent le numéro de pièce 123-456-789 ou quelque chose du genre.

J'aime utiliser des identifiants naturels comme clés primaires lorsque cela est possible. Mais "quand c'est possible" peut être une contrainte importante. Si votre identifiant naturel est obtenu en combinant d'une manière ou d'une autre trois autres champs, vous avez quatre possibilités :

  1. Faites en sorte que la clé primaire soit la combinaison de ces trois champs. Cela peut s'avérer pénible. Toutes vos jointures doivent alors correspondre à trois champs, les recherches doivent tester trois champs, etc.

  2. Créez un nouveau champ qui est la concaténation des trois champs, et utilisez-le comme clé primaire. Ensuite, chaque fois que l'un des champs "de base" est modifié, ce champ concaténé est également modifié. C'est une très, très mauvaise idée. Ne le faites pas. Il s'agit de données redondantes, avec toutes les mauvaises choses qui en découlent.

  3. Remplacez les trois champs séparés par un seul champ combiné. C'est pire que le n°2. Maintenant, lorsque vous avez besoin des valeurs individuelles, vous devez démonter le champ.

  4. Abandonnez et créez une clé synthétique, comme un numéro de série. Utilisez-la comme clé primaire, puis utilisez la clé naturelle à des fins d'affichage. Si ma clé naturelle nécessite la concaténation ou la manipulation de trois champs, j'ai tendance à opter pour cette option.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X