Question

Je suis la conception ma base de données / domaine pour une application de commerce électronique et je vais avoir du mal à comprendre comment stocker les produits.

Le site va vendre une large gamme de produits, des stylos, des strings, des tatouages, des parapluies, tout. Chacun de ces produits partageront quelques caractéristiques communes, hauteur, largeur, longueur, poids, etc, mais certains produits ont des données spéciales. Par exemple, des stylos ont différentes couleurs d'encre et conseils / couvercles et brochures peuvent avoir différents types de plis. Jusqu'à présent, j'ai pensé quelques 20+ attributs supplémentaires, mais ces attributs ne peuvent concerner que 1% des produits sur le site.

Je me demande s'il convient de mettre en œuvre un modèle EAV pour gérer les données supplémentaires. En gardant à l'esprit que lorsque les clients sont affichés sur le site dans le frontend, il y aura une barre latérale comme le filtrage sur eBay et carsales.com.au. (En gardant à l'esprit donc il y aura un peu de mal de requêtes)

Je ne pense pas qu'il est pratique de mettre en œuvre l'héritage de classe Tableau que le système doit rester flexible. En effet, sur la piste, nous pouvons avoir plus d'attributs à l'avenir avec de nouveaux types de produits.

L'autre chose que j'ai considéré utilise une base de données NoSQL (probablement MongoDB) mais j'ai peu d'expérience avec ces types de bases de données, cela résoudra même mon problème?

Examen des options:

  1. entité de produits simples avec beaucoup de colonnes
  2. entité séparée attributs (EAV)
  3. Passer au schéma moins la persistance

Je suis en train de construire un prototype avec un attributs d'entité pour voir comment elle est flexible, et tester les performances et comment hors de contrôle l'interrogation obtient.

EDIT:. Je suis, bien sûr, ouvert à toutes les autres solutions

Était-ce utile?

La solution

Bonne question, mais bien sûr, il n'y a pas de « vrai chemin ». Comme par @BenV, Magento n'utilise le modèle EAV. Mon expérience avec elle a été extrêmement positive, mais il fait trébucher les autres utilisateurs. Quelques considérations:

1. Performance. EAV exige complexe, multi-jointures de tables pour remplir votre objet avec les attributs pertinents. Cela ne entraîne une baisse de performance. Toutefois, cela peut être atténué par la mise en cache attention (à tous les niveaux à travers la pile, y compris la mise en cache de requête) et l'utilisation sélective de dénormalisation. Magento ne permet aux administrateurs de sélectionner un modèle dénormaliser pour les catégories et les produits pour lesquels le nombre de bons UGS il (généralement dans les milliers). Cela requiert des observateurs qui déclenchent réindexation (toujours bon!) Et mises à jour les tables dénormalisées « plat » en cas de changement de données produit. Cela peut également être planifié ou déclenché manuellement avec une invite à l'administrateur.

2. 3rd Party complexité de l'utilisateur Si jamais vous envisagez de faire cette demande à la disposition des autres utilisateurs, beaucoup trouveront EAV trop complexe et vous finirez par faire face avec beaucoup de bêlant et d'abus mal informés sur les forums d'utilisateurs (ref Magento !!).

3. Extensibilité future et l'architecture plugin. Il ne fait aucun doute que le modèle EAV est vraiment dans son propre quand est un facteur d'extensibilité. Il est très simple d'ajouter de nouveaux attributs dans le modèle tout en minimisant le risque de rupture ORM existant et le code contrôleur.

4. Les changements dans le type de données EAV ne le rendre un peu plus difficile de modifier les types de données d'attributs. Si vos appels de conception initiale pour un type d'attribut particulier que les changements à l'avenir (à dire int varchar), cela signifie que vous devrez migrer tous les enregistrements pour cet attribut à la table correspondante qui correspond au nouveau type de données. Bien sûr, les puristes suggéreraient que vous obtenez la bonne conception première fois, mais la réalité fait parfois Intrusion ne!

5. Les importations de produits manuel Une chose qui rend presque impossible EAV est l'importation de produits (ou d'autres entités) dans la base de données en utilisant SQL et / ou CSV / XML style phpMyAdmin. Vous aurez besoin d'écrire un module importateur qui accepte les données structurées et passe à travers la couche modèle de l'application de persister à la base de données. Cela n'ajoute à votre complexité.

Autres conseils

Le centre commercial open source panier Magento permet des attributs personnalisés pour leurs produits en utilisant une conception EAV. Vous pouvez vérifier le schéma sur leur base de données .

Je vous suggère de regarder de plus près sur la doctrine 2 ORM avec le plugin OXM pour elle (https://github.com/doctrine/oxm). Il permettra de résoudre votre problème avec des attributs différents. Bien sûr, vous devrez les index de construction pour les attributs personnalisés à rechercher, mais je ne pense pas que ce sera un problème:)

Si vous ne se soucient pas de nombre de membres de la communauté, vous pouvez utiliser MongoDB ainsi.

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