2012-05-26 4 views
0

J'ai construit une base de données et j'ai environ 8 tables différentes pour différents types d'éléments. Je l'ai fait parce que chaque table est une catégorie et chaque élément a des champs différents, donc je ne pouvais pas les faire tous 1 table. Le problème que je rencontre est que j'ai besoin que le champ itemID soit unique sur toutes les tables. Pas seulement unique à chaque table. Par exemple, si un administrateur ajoute un élément dans 1 table, l'ID d'élément pour cet élément ne peut pas être un doublon d'un autre élément dans une table différente ou cela me causera des problèmes. S'il vous plaît, aidez-moi à régler cela correctement. Puis-je le faire directement dans la base de données? Ou dois-je créer un script PHP pour vérifier si le numéro d'article existe déjà?Champ unique de la base de données MySQL (non unique)

J'espère avoir expliqué cela correctement. :)

+0

semble que vous devriez reconsidérer toute la structure, si ce n'est pas trop tard. –

Répondre

0

Créer une table pour contenir le champ globalement unique, ce sera la table parent.

Faites en sorte que tous les autres champs étrangers uniques pointant vers la nouvelle table (champ), ce soient les tables enfants. Lors de l'insertion, assurez-vous de toujours insérer la nouvelle valeur dans la table parente avant de l'insérer dans la table enfant (sinon cela entraînera une violation d'intégrité). Lors de la mise à jour, assurez-vous de toujours mettre à jour le champ unique uniquement dans la table parent et non dans la table enfant.

Ajoutez une contrainte unique supplémentaire sur les clés étrangères dans les tables enfant, afin qu'elles ne puissent pas pointer vers la même valeur de table parent.

0

Vous générez un ID unique (comme un GUID) et l'utilisez comme clé (ou comme clé unique alternative). Ou ayez une table appelée Entités avec un identifiant unique, puis ajoutez une clé étrangère. L'idée est, vous insérez dans des entités, récupérez votre ID et puis utilisez cela pour insérer dans les tables enfant.

Parions que vous ne ferez pas à nouveau cette erreur. :(

0

La meilleure façon de le faire serait de convertir chaque PK d'utiliser un GUID. Il y a une bonne articly par Jeff Atwood qui traite les mérites relatifs des ID vs GUIDs. Il est même une fonction MySQL pour générer Je n'ai jamais utilisé cette fonction et je comprends qu'il y a eu des problèmes de réplication, même si je crois que ceux-ci ont été corrigés dans les versions récentes

L'autre façon d'y arriver serait d'avoir un table séparée pour contrôler les entités elles-mêmes et utiliser un auto-incrément pour garder les ID uniques.Tous vos tableaux individuels référenceraient alors cette table.C'est un peu plus compliqué en termes d'applicatio n logique pour garder l'intégrité des données mais c'est possible.

Ou vous pourriez avoir une table maître selon la deuxième option et une autre table contenant des paires clé/valeur pour les paramètres qui varient entre les différentes catégories. Cela peut être une bonne option si les paramètres supplémentaires sont tous secondaires à l'information de l'entité principale (qui ne varie pas entre les différentes catégories).

La meilleure option dépend de la structure et de la sémantique de votre modèle de données et de votre cas d'utilisation (c'est-à-dire de la manière dont vous accédez le plus souvent aux données).

Il y a plus d'informations à propos de mapping this sort of inheritance structure to a relational database here. Bien sûr, si vous êtes prêt à regarder en dehors de MySQL, il existe différentes bases de données NoSQL qui conviendraient beaucoup mieux à ce genre de scénario.

Questions connexes