La conception d'un schéma SQL pour une combinaison de plusieurs-à-plusieurs relations (des variations de produits)
J'espère que le titre est quelque peu utile. Je suis en utilisant MySQL comme ma base de données
Je suis la construction d'une base de données de produits et je suis pas sûr de la façon de gérer le stockage de prix/SKU des variantes d'un même produit. Un produit peut avoir illimité de variations, et chaque variation de la combinaison a son propre prix/STOCK/etc..
C'est de cette façon que j'ai mes produits et/ou des variations de table à l'instant:
PRODUCTS
+--------------------------+
| id | name | description |
+----+------+--------------+
| 1 | rug | a cool rug |
| 2 | cup | a coffee cup |
+----+------+--------------+
PRODUCT_VARIANTS
+----+------------+----------+-----------+
| id | product_id | variant | value |
+----+------------+----------+-----------+
| 1 | 1 | color | red |
| 2 | 1 | color | blue |
| 3 | 1 | color | green |
| 4 | 1 | material | wool |
| 5 | 1 | material | polyester |
| 6 | 2 | size | small |
| 7 | 2 | size | medium |
| 8 | 2 | size | large |
+----+------------+----------+-----------+
(`products.id` is a foreign key of `product_variants.product_id`)
J'ai créé un SQLFiddle avec cet exemple de données: http://sqlfiddle.com/#!2/2264d/1
L'utilisateur est autorisé à accéder à toute variation de nom (product_variants.variant
) et peut attribuer une valeur (product_variants.value
). Il ne devrait pas être une limite à la quantité de variations de valeurs ou un utilisateur peut entrer.
C'est là que mon problème se pose: le stockage de prix/SKU pour chaque variation sans l'ajout d'une nouvelle table/colonne chaque fois que quelqu'un ajoute un produit avec une variante qui n'existaient pas avant.
Chaque variante peut avoir le même prix, mais la référence est unique à chaque produit.
Par exemple Produit 1
a 6 combinaisons différentes (3 couleurs * 2 matériaux) et le Produit 2
a seulement 3 différentes combinaisons (3 tailles * 1).
J'ai pensé à stocker les combinaisons comme un texte, j'.e:
+------------+-----------------+-------+------+
| product_id | combination | price | SKU |
+------------+-----------------+-------+------+
| 1 | red-wool | 50.00 | A121 |
| 1 | red-polyester | 50.00 | A122 |
| 1 | blue-wool | 50.00 | A123 |
| 1 | blue-polyester | 50.00 | A124 |
| 1 | green-wool | 50.00 | A125 |
| 1 | green-polyester | 50.00 | A125 |
| 2 | small | 4.00 | CD12 |
| 2 | medium | 4.00 | CD13 |
| 2 | large | 3.50 | CD14 |
+------------+-----------------+-------+------+
Mais il doit y avoir un mieux, normalisé, la manière de représenter ces données. Situation hypothétique: je veux être en mesure de rechercher un produit bleu qui est inférieur à 10$. Avec la structure de base de données, il n'est pas possible de le faire sans l'analyse du texte et c'est quelque chose que je veux éviter.
Toute aide/suggestions sont appréciés =)
OriginalL'auteur Xecure | 2013-10-02
Vous devez vous connecter pour publier un commentaire.
L'application de la normalisation à votre problème, la solution est donnée. Exécuter et de le voir sur le Violon
Violon
Je ne recommande pas que, depuis que vous aviez mélanger votre logique métier dans votre couche de données
Pouvez-vous expliquer l'utilisation de la product_details table?
Au lieu de deux tables produits et product_variants, qu'il sera mieux si un seul tableau product_variants est utilisé avec product_id sur la table product_variants renvoyant vers le parent de l'id de produit.
Pouvez-vous expliquer l'utilisation de la product_details table?
OriginalL'auteur sahalMoidu
Partie de vos problèmes proviennent d'une confusion entre le produit et le numéro de référence.
Lorsque vous vendez, "XYZ pull, taille M, bleu modèle", celui-ci correspond à un SKU. Il est commercialisé comme un XYZ pull (le produit), qui possède un ensemble d'attributs (taille et couleurs), chacun avec leur propre ensemble de valeurs possibles. Et pas toutes les combinaisons possibles de ces derniers pourrait donner valide les livrables: vous ne trouverez pas ridiculement mince et longue jeans. Sku, les produits, les attributs, les valeurs d'attribut.
Et lorsqu'un utilisateur veut un $10 bleu pull-over, il est actuellement à la recherche d'un SKU au sein d'une catégorie de produit.
J'espère que le ci-dessus efface votre confusion et où votre problème et de la question de la tige.
En termes de schéma, vous voulez quelque chose comme ceci:
produits
Éventuellement, ajoutez aussi:
C'est un marketing table liée. Rien d'autre. Si rien en dehors du marketing utilise un produit dans votre application, vous vous retrouverez dans un monde de douleur en bas de la route.
Le prix, si présent, est un maître des prix utilisée pour renseigner le champ quand il est nul dans les stocks de pièces. Cela rend le prix d'entrée plus convivial.
in_stock est un espoir auto-explanationary drapeau, idéalement maintenu par un déclencheur. Il devrait en être de même si tout SKU liés à ce produit est en stock.
product_attributes
product_attribute_values
Cela tient juste des choses comme la Couleur, la Taille, etc., avec leurs valeurs comme le bleu, le rouge, S, M, L.
Note le product_id champ: de créer un nouvel ensemble d'attributs et de valeurs par produit. Les tailles changent en fonction du produit. Parfois, il est S, M, L, etc.; d'autres fois, il va être 38, 40, 42, et ce n'est pas. Parfois, la Taille est assez; d'autres fois, vous avez besoin de la Largeur et de la Longueur. Bleu peut être valide, la couleur de ce produit; un autre peut offrir à la Marine, Bleu Royal, bleu Sarcelle et de ce pas. Ne PAS supposer qu'il existe un lien entre un produit attributs et ceux d'une autre; les similitudes, quand ils existent, sont entièrement à la cosmétique et de la coïncidence.
Références
Vous pouvez éventuellement ajouter:
Cela correspond à des produits qui sont expédiés.
C'est en fait le plus important de la table en dessous. Ce, plutôt que de le product_id, qui est presque certainement ce que doit obtenir référencé dans les commandes des clients. C'est aussi ce qui doit obtenir référencé pour la gestion de stock et ainsi de suite. (La seule exception que j'ai jamais vu pour les deux derniers points, c'est quand vous vendez quelque chose de vraiment générique. Mais même alors, le meilleur moyen de traiter cette question dans mon expérience est à jeter dans un n-m relation entre interchangeables Références.)
Le nom de domaine, si vous ajoutez à cela, principalement à des fins de commodité. Si la gauche null, utilisez l'application du code côté pour le faire correspondre au générique le nom du produit, de l'expansion si nécessaire, avec les noms et valeurs d'attributs. Le remplissage il permet de reformuler le dernier nom générique ("Levis' 501, W: 32, L: 32, Couleur: Bleu Foncé") avec quelque chose de plus naturel ("Levis' 501, 32x32, Bleu Foncé").
En cas de questions, le stock est mieux maintenu à l'aide d'un déclencheur dans le long terme, avec une comptabilité à double entrée de schéma dans l'arrière-plan. Cela permet de distinguer entre en stock et disponibles pour une expédition aujourd'hui (qui est le chiffre que vous voulez ici) vs en stock, mais déjà vendus, parmi les multitudes de scénarios réels que vous allez rencontrer. Oh, et... c'est parfois un numérique, plutôt qu'un entier, si jamais vous avez besoin de vendre quoi que ce soit mesurée en kg ou en litres. Si oui, assurez-vous d'ajouter un supplément de is_int drapeau, pour éviter clients de vous envoyer des commandes pour .1 les ordinateurs portables.
product_variants
Ce liens la livrable's id correspondant à des attributs et des valeurs, pour le bien de la génération de noms par défaut.
La clé primaire est sur (sku_id, attribute_id).
Vous pourriez trouver la product_id champ une aberrance. C'est, sauf si vous ajoutez des clés étrangères référencement:
(N'oubliez pas les extra index uniques sur les tuples si vous décidez d'ajouter ces clés étrangères.)
Trois remarques complémentaires en guise de conclusion.
Tout d'abord, je tiens à souligner encore une fois que, en termes de flux, toutes les combinaisons d'attributs et de valeurs de rendement valide d'un livrable. La largeur peut être de 28 à 42 ans et la longueur peut être de 28 à 42 ans, mais vous ne verrez probablement pas une très maigre 28x42 jeans. Vous êtes mieux de ne PAS remplir automatiquement toutes les variations possibles de chaque produit par défaut: ajouter de l'INTERFACE utilisateur pour activer/désactiver au besoin, faire vérifier par défaut, aux côtés de nom, code-barres et les zones de prix. (Le nom et le prix sera généralement laissée en blanc; mais un jour, vous aurez besoin pour organiser une vente sur bleu pull-overs seulement, au motif que la couleur est interrompu, tandis que vous continuez à vendre les autres options.)
Deuxièmement, gardez à l'esprit, si jamais vous avez besoin de gérer les options de produit, que beaucoup sont en fait les attributs d'un produit dans le déguisement, et que ceux qui ne sont pas donner de nouvelles Références qui doivent également être pris en compte quand il s'agit de gestion de stock. Une plus grande option HD pour ordinateur portable, par exemple, est en fait une variante du même produit (Normal vs Grand HD taille) qui est déguisé en option en raison de (très) considérations de l'INTERFACE utilisateur. En revanche, l'emballage de l'ordinateur portable comme un cadeau de noël est un véritable option qui a des références complètement distincte SKU dans la comptabilité termes (par exemple .8m de cadeau) -- et, si jamais vous avez besoin de venir avec des coûts marginaux moyens, en une fraction du temps du personnel.
Enfin, vous aurez besoin de venir avec une méthode de classement pour vos attributs, leurs valeurs, et les variantes ultérieures. Pour cela, le plus simple est de le jeter dans une position supplémentaire de terrain dans les attributs et les valeurs des tables.
À mon avis, c'est surtout un problème de l'INTERFACE utilisateur. Même dans un déclencheur orienté application, je n'aurais pas remplir les variantes de table automatiquement lorsque les attributs et leurs valeurs sont créés, car cela devient malpropre et finit par faire beaucoup de calcul pour rien. Au lieu de cela, j'aurais du produit interface de création de remplir une liste complète des potentiels de Références sur la volée, sur la base des attributs et de leurs valeurs. Ceux qui un opérateur humain attribue un SKU code (c'est à dire qu'ils sont produits réels plutôt que potentiellement existants) sont alors les seuls que j'avais ensuite le stocker dans la base de données.
Je suis occupé implementin votre solution sur un projet de mine, et je me demandais si vous pourriez aller et de regarder ma question que j'ai posté sur: stackoverflow.com/questions/30995983/.... J'espère entendre parler de vous 🙂
Comment le stock sera géré ici? J'imagine que depuis que nous avons variantes par product_id, il y aurait un stock par chaque variation? Mais alors comment les produits qui n'ont pas de variation de la poignée de stock?
OriginalL'auteur Denis de Bernardy
Je voudrais utiliser les 4 tableaux:
par exemple, 1, 'tapis', 'un café tapis' /2, 'tasse', 'une tasse de café'
par exemple, 1, 10, 'couleur' /1, 11, 'matériel'
par exemple 'A121', 1, 50.00 /'A122', 1, 45.00
par exemple 'A121', 10, 'rouge' /'A121', 11, 'laine' /'A122', 10, 'vert' /'A122', 11, 'laine'
Cela permet à l'utilisateur de définir une propriété pour votre vendable produits qu'il souhaite.
Votre application devra s'assurer auprès de sa logique d'entreprise qui sellable_products sont décrits complètement (vérifier que pour chaque applicable produit générique de propriété les produits vendables propriété est définie).
OriginalL'auteur xwoker
Ceci est similaire à une autre question, j'ai vu un tout à l'arrière de son sur DONC
La conception d'une base de données, ce Qui est la meilleure approche?
Si vous prenez un coup d'oeil, vous verrez que vous êtes essentiellement à poser les mêmes étroit (attribut) vs grande question de la table. J'ai utilisé à la fois en fonction du scénario, mais je serais vraiment attention à la façon dont vous l'avez mis en œuvre dès maintenant. Et le fait qu'il n'y a vraiment pas une bonne façon de faire correspondre les variantes de l'Ugs (du moins pas que je pense) peut vous obliger à modifier vos tables.
Si vous avez donc de nombreuses variantes vous aussi vous aimeriez peut-être une valeur-clé de la base de données, ou une autre solution NoSQL.
OriginalL'auteur Brad
En termes généraux, vous êtes à la recherche de ce qu'on appelle un mérou ou d'une jonque dimension. En gros, c'est juste une ligne pour chaque combination.@sahalMoidu's schéma semble que ça devrait vous donner ce que vous demandez.
Mais avant d'arriver trop accroché sur la normalisation, vous avez besoin de savoir si la db est là pour le stockage des données (transactions, etc) ou pour l'obtention de données (dimensions, rapports, etc). Même si c'est une base de données transactionnelle, vous devez vous demander ce que vous essayez d'accomplir par la normalisation.
OriginalL'auteur Andrew
Sku est votre clé primaire. Vous pouvez configurer les relations de clé étrangère pour les variantes de table de sku. Oublier productid entièrement.
Créer le tableau x (référence, prix, description) clé primaire sku
OriginalL'auteur danny117