Question

Je suppose que cela est une question semi-commun, mais je ne peux pas le trouver dans la liste des questions précédentes. J'ai un ensemble de tables pour les produits qui ont besoin de partager un indice de clé primaire. Supposons que quelque chose comme ce qui suit:

product1_table:
    id,
    name,
    category,
    ...other fields

product2_table:
    id,
    name,
    category,
    ...other fields

product_to_category_table:
    product_id,
    category_id

Il est clair qu'il serait utile d'avoir un index partagé entre les deux tables de produits. Note, l'idée de les garder séparés est parce qu'ils ont largement différents ensembles de champs au-delà des notions de base, mais ils partagent une catégorisation commune.

Mise à jour:

Beaucoup de gens ont suggéré l'héritage de table (ou gen-spec). Ceci est une option que je suis au courant, mais étant donné dans d'autres systèmes de base de données que je pourrais partager une séquence entre les tables que j'espérais MySQL avait une solution similaire. Je suppose qu'il ne repose sur les réponses. Je suppose que je vais devoir aller avec l'héritage de table ... Merci à vous tous.

Était-ce utile?

La solution

Il est pas vraiment commun, non. Il n'y a aucun moyen natif de partager une clé primaire. Ce que je pourrais faire dans votre situation est la suivante:

product_table
    id
    name
    category
    general_fields...

product_type1_table:
    id
    product_id
    product_type1_fields...

product_type2_table:
    id
    product_id
    product_type2_fields...

product_to_category_table:
    product_id
    category_id

C'est, il y a une table de produit principal qui a des entrées pour tous les produits et a les champs qui généralisent entre les types et tables spécifié- avec les clés étrangères dans la table des produits maître, qui ont les données spécifiques de type.

Autres conseils

Une meilleure conception est de mettre les colonnes communes dans une table de produits, et les colonnes spéciales dans deux tables séparées. Utilisez le product_id comme clé primaire dans les trois tableaux, mais dans les deux tableaux spéciaux, il est, en outre, un dos de clé étrangère à la table principale de produits.

Ceci simplifie la recherche de produits de base pour les ids et les noms par catégorie.

Notez également que votre conception permet à chaque produit d'être dans une catégorie au plus.

Il semble que vous êtes à la recherche de l'héritage de table.

Vous pouvez utiliser un product de table commune avec des attributs communs aux deux product1 et produit2 plus un attribut type qui pourrait être soit "product2" ou "product1"

Alors tables product1 et product2 aurait tous leurs attributs spécifiques et une référence à la parent Tableau product.

product:
    id,
    name,
    category,
    type

product1_table:
    id,
    #product_id,
    product1_specific_fields

product2_table:
    id,
    #product_id,
    product2_specific_fields

Tout d'abord permettez-moi de dire que je suis d'accord avec tout ce chaos, Larry et Phil ont dit.

Mais si vous insistez sur une autre façon ...

Il y a deux raisons de votre PK partagée. Un caractère unique entre les deux tables et deux pour compléter l'intégrité référentielle.

Je ne sais pas exactement quelles sont les caractéristiques « séquence » le support des colonnes AUTO_INCREMENT. Il semble comme il y a un réglage du système pour définir l'incrément de valeur, mais rien par colonne.

Qu'est-ce que je ferais dans Oracle est juste partager la même séquence entre les deux tables. Une autre technique serait de définir une valeur de STEP 2 dans le auto_increment et commencer un à 1 et l'autre à 2. De toute façon, vous générez des valeurs uniques entre eux.

Vous pouvez créer une troisième table qui n'a rien mais la colonne PK. Cette colonne pourrait également fournir s'il n'y a Auto-numérotation aucun moyen de créer un autonumber sauter au sein d'un serveur. Ensuite, sur chacune de vos tables de données que vous souhaitez ajouter des déclencheurs CRUD. Un insert dans chaque table de données devrait d'abord lancer une insertion dans la table d'index de pseudo (et retourner l'identifiant pour une utilisation dans la table locale). De même une suppression de la table locale lancerait une suppression de la table d'index pseudo. Toutes les tables pour les enfants qui doivent pointer vers un point de parent à cette table d'index pseudo.

Notez que ce devra être un déclencheur par rangée et ralentira crud sur ces tables. Mais les tables comme « produit » ont généralement pas un taux très élevé de DML en premier lieu. Toute personne qui se plaint de "l'impact de la performance" est pas échelle compte.

S'il vous plaît noter que ceci est fourni comme une alternative qui fonctionne et non ma recommandation comme meilleurs chemin

Vous ne pouvez pas "partager" une clé primaire.

Sans connaître tous les détails, mon meilleur conseil est de combiner les tables dans une table unique produit. Avoir des champs facultatifs qui sont remplis pour certains produits et pas d'autres ne sont pas nécessairement une mauvaise conception.

Une autre option est d'avoir une sorte de modèle d'héritage, de où vous avez une table unique de produit, puis deux produits tables « sous-type », qui référence la table principale du produit et ont leur propre ensemble spécialisé de champs. Interrogation ce modèle est plus douloureux qu'une seule table à mon humble avis, ce qui est la raison pour laquelle je le vois comme l'option moins souhaitable.

Votre explication est un peu vague mais, de ma compréhension de base, je serais tenté de le faire

Le tableau produit contient des champs communs

product
-------
product_id
name
...

la table product_extra1 et la table product_extra2 contiennent différents champs ces tables habe une relation un à un entre PRODUCT.PRODUCT_ID appliquée et product_extra1.product_id etc. Imposer une relation biunivoque en définissant la product_id dans les tableaux clés étrangères (product_extra1, etc) pour être unique en utilisant une contrainte unique. vous devrez fixé les règles d'affaires à la façon dont ces données est remplie

product_extra1
---------------
product_id
extra_field1
extra_field2
....

product_extra2
---------------
product_id
different_extra_field1
different_extra_field2
....

D'après ce que vous avez au-dessus de la table PRODUCT_CATEGORY est une table d'intersection (1 à plusieurs - beaucoup 1) qui impliquerait que chaque produit peut être lié à de nombreuses catégories Cela peut maintenant rester le même.

Ceci est un autre cas de gen-spec.

Voir discussion précédente

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top