Une ou Deux Clés Primaires dans plusieurs-à-Plusieurs Table?
J'ai les tables suivantes dans ma base de données qui ont un plusieurs-à-plusieurs relations, ce qui est exprimé par une connexion de table qui a les clés étrangères pour les clés primaires de chacune des tables principales:
- Widget: WidgetID (PK), Titre, Prix
- Utilisateur: nom d'utilisateur (PK), FirstName, LastName
Supposent que chaque Utilisateur-Widget combinaison est unique. Je vois deux options pour la structure de connexion de la table qui définit la relation de données:
- UserWidgets1: UserWidgetID (PK), WidgetID (FK), l'Identifiant (FK)
- UserWidgets2: WidgetID (PK, FK), l'Identifiant (PK, FK)
L'Option 1 a une seule colonne de la Clé Primaire. Toutefois, cela semble inutile, car les seules données stockées dans le tableau est la relation entre les deux tables principales, et cette relation elle-même peut constituer une clé unique. Conduisant ainsi à l'option 2, qui a deux colonnes de clé primaire, mais perd la colonne identifiant unique que l'option 1 est. Je pourrais aussi éventuellement ajouter un à deux colonnes, index unique (WidgetID, UserID) à la première table.
Est-il une vraie différence entre les deux en terme de performance, ou aucune raison de préférer une approche sur l'autre pour la structuration de la UserWidgets plusieurs-à-plusieurs table?
OriginalL'auteur Yaakov Ellis | 2008-09-02
Vous devez vous connecter pour publier un commentaire.
Vous n'avez qu'une clé primaire dans les deux cas. Le second est ce qu'on appelle une clé composée. Il n'y a aucune bonne raison de l'introduction d'une nouvelle colonne. Dans la pratique, vous devrez garder un index unique sur toutes candidat clés. Ajout d'une nouvelle colonne vous achète rien mais les frais de maintenance.
Aller avec l'option 2.
Je crois que la réponse ci-dessus, dit que vous avez une clé primaire dans les deux cas, y compris dans le cas où vous avez une clé composée. Avez-vous quelque chose à ajouter?
OriginalL'auteur Apocalisp
Personnellement, je serait ont l'synthétique/colonne de clé de substitution dans plusieurs-à-plusieurs tables pour les raisons suivantes:
La synthèse la clé n'est pas un remplacement pour le naturel, composé de la clé, ni le
PRIMARY KEY
pour cette table juste parce que c'est la première colonne de la table, donc je suis partiellement d'accord avec Josh Berkus article. Cependant, je ne pense pas que les clés sont toujours de bons candidats pourPRIMARY KEY's
et ne devrait certainement pas être utilisés s'ils sont utilisés comme clés étrangères dans d'autres tables.oui, il serait unique, mais de créer une contrainte sur une clé composée est moche/ne pas entre les plates-formes. Je préfère être explicite et cohérente. Chaque table a une colonne d'identité.
OriginalL'auteur Guy
Option 2 utilise un simple compund touche, l'option 1 utilise un clé de substitution. L'Option 2 est préféré dans la plupart des scénarios, et est proche du lreational modèle en ce qu'il est un bon candidat à la clé.
Il y a des situations où vous souhaiterez peut-être utiliser une clé de substitution (Option 1)
En règle générale, lors de la modélisation de données, vous trouverez que la plupart les entités associatives (plusieurs à plusieurs) sont le résultat d'un événement. Personne prenne l'emploi, l'élément est ajouté au panier, etc. La plupart des événements ont une dépendance temporelle sur l'événement, où la date ou l'heure est pertinent - dans ce cas, une clé de substitution peut être la meilleure alternative.
Donc, prenez l'option 2, mais assurez-vous que vous avez le modèle complet.
OriginalL'auteur Simon Munro
Je suis d'accord avec les réponses précédentes, mais j'ai une remarque à ajouter.
Si vous souhaitez ajouter plus d'informations à la relation et permettre à davantage de relations entre les deux mêmes entités, vous avez besoin de l'option.
Par exemple, si vous souhaitez suivre toutes les fois où l'utilisateur 1 a utilisé le widget 664 dans le userwidget table le nom d'utilisateur et widgetid n'est pas unique plus.
OriginalL'auteur Mendelt
Quel est l'avantage d'une clé primaire dans ce scénario? Envisager la possibilité de sans clé primaire:
UserWidgets3: WidgetID (FK), l'Identifiant (FK)
Si vous voulez unicité puis utiliser la clé composée (UserWidgets2) ou d'une contrainte d'unicité.
La performance habituelle avantage d'avoir une clé primaire est que vous avez souvent requête de la table par la clé primaire, ce qui est rapide. Dans le cas de plusieurs-à-plusieurs tables, vous n'avez pas l'habitude de la requête par la clé primaire, donc il n'y a pas de gain de performances. Plusieurs-à-plusieurs tables sont interrogés par leurs clés étrangères, de sorte que vous devriez envisager d'ajouter des index sur WidgetID et UserID.
OriginalL'auteur liammclennan
L'Option 2 est la bonne réponse, à moins d'avoir une très bonne raison d'ajouter un substitut à la touche numérique (ce que vous avez fait dans l'option 1).
De substitution touche numérique, les colonnes ne sont pas des "clés primaires'. Les clés primaires sont techniquement l'un de la combinaison de colonnes qui identifient de façon unique un enregistrement dans une table.
Quiconque construit une base de données devraient lire cet article http://it.toolbox.com/blogs/database-soup/primary-keyvil-part-i-7327 par Josh Berkus de comprendre la différence entre la mère porteuse numérique colonnes clés primaires et clés.
Dans mon expérience, la seule vraie raison pour ajouter un substitut à la touche numérique pour votre table est si votre clé primaire est un composé clé et doit être utilisé comme une référence de clé étrangère dans une autre table. Ensuite, il ne vous même de penser à ajouter une colonne à la table.
Chaque fois que je vois une structure de base de données où chaque table a une colonne' id les chances sont qu'il a été conçu par quelqu'un qui n'apprécie pas le modèle relationnel et qu'il va invariablement d'afficher un ou plusieurs des problèmes identifiés en matière de Josh article.
OriginalL'auteur andy47
Je voudrais aller avec les deux.
Écoutez-moi:
La clé composée est évidemment la belle, la bonne façon de procéder dans la mesure où reflétant le sens de vos données. Aucune question.
Toutefois: j'ai eu toutes sortes de difficultés à faire hibernate fonctionner correctement si vous utilisez un seul généré clé primaire une clé de substitution.
Donc je voudrais utiliser une logique et physique des données modèle. La logique est la clé composée. Le modèle physique - qui met en œuvre le modèle logique - a la clé de substitution et les clés étrangères.
OriginalL'auteur paulmurray
Puisque chaque Utilisateur Widget combinaison est unique, vous devez vous représenter que, dans votre table en faisant la combinaison unique. En d'autres termes, allez à l'option 2. Sinon vous pourriez avoir deux entrées avec le même widget et Id utilisateur, mais différent de l'utilisateur-widget Id.
OriginalL'auteur Kyle Cronin
La userwidgetid dans le premier tableau n'est pas nécessaire, comme vous l'avez dit, l'originalité vient de la combinaison de la widgetid et le nom d'utilisateur.
Je voudrais utiliser le deuxième tableau, garder le foriegn clés et ajouter un index unique sur widgetid et userid.
Donc:
Il ya un certain gain de performance n'ayant pas le supplément de clé primaire, comme la base de données n'aurait pas besoin de calculer l'index de la clé. Dans le modèle ci-dessus bien que cet indice (par le biais de la unique_index) est toujours calculé, mais je crois que c'est plus facile à comprendre.
OriginalL'auteur roo