Il est prudent de dire que le modèle de base de données EAV / CR est mauvais. Cela dit,
Question: Quel modèle, technique ou modèle de base de données doit être utilisé pour traiter les «classes» d'attributs décrivant les produits de commerce électronique qui peuvent être modifiés au moment de l'exécution?
Dans une bonne base de données E-commerce, vous stockerez des classes d'options (comme la résolution TV, vous aurez alors une résolution pour chaque téléviseur, mais le produit suivant peut ne pas être un téléviseur et ne pas avoir de «résolution TV»). Comment les stocker, rechercher efficacement et permettre à vos utilisateurs de configurer des types de produits avec des champs variables décrivant leurs produits? Si le moteur de recherche constate que les clients recherchent généralement des téléviseurs en fonction de la profondeur de la console, vous pouvez ajouter une profondeur de console à vos champs, puis ajouter une seule profondeur pour chaque type de produit de télévision au moment de l'exécution.
Il existe une fonctionnalité commune intéressante parmi les bonnes applications de commerce électronique: elles affichent un ensemble de produits, puis des menus latéraux "d'exploration vers le bas" où vous pouvez voir "Résolution TV" comme en-tête, et les cinq résolutions TV les plus courantes pour le trouvé ensemble. Vous cliquez sur l'un d'entre eux et il n'affiche que les téléviseurs de cette résolution, ce qui vous permet d'approfondir davantage en sélectionnant d'autres catégories dans le menu latéral. Ces options seraient les attributs de produit dynamiques ajoutés au moment de l'exécution.
Discussion supplémentaire:
Bref, y a-t-il des liens sur Internet ou des descriptions de modèles qui pourraient «académiquement» corriger la configuration suivante? Je remercie Noel Kennedy d'avoir suggéré un tableau de catégories, mais le besoin peut être plus grand que cela. Je le décris d'une manière différente ci-dessous, en essayant de mettre en évidence la signification. J'ai peut-être besoin d'une correction de point de vue pour résoudre le problème, ou j'ai peut-être besoin d'aller plus loin dans l'EAV / CR.
J'adore la réponse positive au modèle EAV / CR. Mes collègues développeurs disent tous ce que Jeffrey Kemp a évoqué ci-dessous: "les nouvelles entités doivent être modélisées et conçues par un professionnel" (hors contexte, lire sa réponse ci-dessous). Le problème est:
- les entités ajoutent et suppriment des attributs chaque semaine
(les mots-clés de recherche dictent les attributs futurs) - de nouvelles entités arrivent chaque semaine
(les produits sont assemblés à partir de pièces) - les anciennes entités disparaissent chaque semaine
(archivées, moins populaires, saisonnières)
Le client souhaite ajouter des attributs aux produits pour deux raisons:
- service / recherche par mot-clé / tableau de comparaison entre des produits similaires
- configuration du produit de consommation avant le paiement
Les attributs doivent avoir une signification, pas seulement une recherche par mot-clé. S'ils veulent comparer tous les gâteaux qui ont un "glaçage à la crème fouettée", ils peuvent cliquer sur les gâteaux, cliquer sur le thème de l'anniversaire, cliquer sur le glaçage à la crème fouettée, puis vérifier tous les gâteaux qui sont intéressants sachant qu'ils ont tous un glaçage à la crème fouettée. Ce n'est pas spécifique aux gâteaux, juste un exemple.
la source
Réponses:
Il y a quelques avantages et inconvénients généraux auxquels je peux penser, il y a des situations où l'un est meilleur que l'autre:
Option 1, modèle EAV:
Option 2, modéliser chaque entité séparément:
Option 3, combinaison (modèle d'entités "correctement", mais ajoutez des "extensions" pour les attributs personnalisés pour certaines / toutes les entités)
* Je ne sais pas si l'option 3 permettrait nécessairement de gagner du temps dans la phase de conception.
Personnellement, je pencherais vers l'option 2 et éviterais EAV dans la mesure du possible. Cependant, pour certains scénarios, les utilisateurs ont besoin de la flexibilité fournie avec EAV; mais cela a un coût élevé.
la source
Non ce n'est pas. C'est juste qu'il s'agit d'une utilisation inefficace des bases de données relationnelles. Un magasin purement clé / valeur fonctionne très bien avec ce modèle.
Maintenant, à votre vraie question: comment stocker divers attributs et les garder consultables?
Utilisez simplement EAV. Dans votre cas, ce serait une seule table supplémentaire. indexez-le à la fois sur le nom et la valeur de l'attribut, la plupart des RDBM utiliseraient la compression de préfixe sur les répétitions de nom d'attribut, ce qui le rendrait vraiment rapide et compact.
EAV / CR devient moche lorsque vous l'utilisez pour remplacer des champs «réels». Comme pour tout outil, en abuser est «mauvais» et lui donne une mauvaise image.
la source
hstore
champ (juste une des raisons pour lesquelles nous utilisons PostgreSQL)http://code.google.com/p/xee/source/browse/trunk/XeePhotoshopLoader.m?spec=svn28&r=11#107
Les modèles internes sont au mieux farfelus, comme quelqu'un qui a mis le schéma dans un jeu de boggle, l'a scellé et l'a mis dans un shacker de peinture ...
Monde réel: je travaille sur une application d'exécution de midware et voici l'une des requêtes pour obtenir des informations d'adresse.
Exige des informations d'adresse pour une commande, paresseusement
-
Résumé: n'utilisez Magento que si:
la source
Je suis surpris que personne n'ait mentionné les bases de données NoSQL.
Je n'ai jamais pratiqué NoSQL dans un contexte de production (je viens de tester MongoDB et j'ai été impressionné) mais le but de NoSQL est de pouvoir enregistrer des éléments avec des attributs différents dans le même «document».
la source
Lorsque les performances ne sont pas une exigence majeure, comme dans une application de type ETL, EAV a un autre avantage distinct: les sauvegardes différentielles.
J'ai implémenté un certain nombre d'applications où une exigence primordiale était la possibilité de voir l'historique d'un objet de domaine depuis sa première «version» jusqu'à son état actuel. Si cet objet de domaine a un grand nombre d'attributs, cela signifie que chaque modification nécessite qu'une nouvelle ligne soit insérée dans sa table correspondante (pas une mise à jour car l'historique serait perdu, mais une insertion). Disons que cet objet de domaine est une personne et que j'ai 500 000 personnes à suivre avec une moyenne de plus de 100 changements au cours du cycle de vie des personnes pour divers attributs. Ajoutez à cela le fait que l'application ne possède qu'un seul objet de domaine majeur est rare et vous supposerez rapidement que la taille de la base de données deviendrait rapidement incontrôlable.
Une solution simple consiste à enregistrer uniquement les modifications différentielles des principaux objets du domaine plutôt que d'enregistrer à plusieurs reprises les informations redondantes.
Tous les modèles changent au fil du temps pour refléter les nouveaux besoins commerciaux. Période. L'utilisation d'EAV n'est que l'un des outils de notre boîte à utiliser; mais il ne devrait jamais être automatiquement classé comme «mauvais».
la source
Je lutte avec le même problème. Il peut être intéressant pour vous de consulter la discussion suivante sur deux solutions de commerce électronique existantes: Magento (EAV) et Joomla (structure relationnelle régulière): https://forum.virtuemart.net/index.php?topic=58686.0
Il semble que la performance EAV de Magento soit un véritable coup de cœur.
C'est pourquoi je penche vers une structure normalisée. Pour surmonter le manque de flexibilité, je pense ajouter à l'avenir un dictionnaire de données séparé (XML ou tables DB séparées) qui pourrait être édité, et sur cette base, le code d'application pour afficher et comparer les catégories de produits avec un nouvel ensemble d'attributs serait généré, ainsi que des scripts SQL.
Une telle architecture semble être le bonbon dans ce cas - flexible et performante à la fois.
Le problème pourrait être l'utilisation fréquente d'ALTER TABLE dans un environnement réel. J'utilise Postgres, donc son MVCC et son DDL transactionnel soulageront, espérons-le, la douleur.
la source
Je vote toujours pour la modélisation au niveau atomique le plus bas significatif pour EAV. Laissez les normes, les technologies et les applications orientées vers certaines communautés d'utilisateurs décider des modèles de contenu, des besoins de répétition des attributs, des grains, etc.
la source
S'il ne s'agit que des attributs du catalogue de produits et que, par conséquent, les exigences de validation pour ces attributs sont plutôt limitées, le seul inconvénient réel de l'EAV est la performance des requêtes et même cela n'est qu'un problème lorsque votre requête traite de plusieurs «choses» (produits) avec des attributs, les performances pour la requête "donnez-moi tous les attributs pour le produit avec l'ID 234", alors qu'elles ne sont pas optimales, sont toujours très rapides.
Une solution consiste à utiliser le modèle de base de données SQL / EAV uniquement pour le côté administrateur / édition du catalogue de produits et de disposer d'un processus qui dénormalise les produits en quelque chose qui permet de les rechercher. Puisque vous avez déjà des attributs et qu'il est donc plutôt probable que vous vouliez des facettes, ce quelque chose pourrait être Solr ou ElasticSearch. Cette approche évite essentiellement tous les inconvénients du modèle EAV et la complexité supplémentaire est limitée à la sérialisation d'un produit complet vers JSON lors de la mise à jour.
la source
L'EAV présente de nombreux inconvénients:
la source
J'ai un problème légèrement différent: au lieu de nombreux attributs avec des valeurs éparses (ce qui est peut-être une bonne raison d'utiliser EAV), je souhaite stocker quelque chose qui ressemble plus à une feuille de calcul. Les colonnes de la feuille peuvent changer, mais dans une feuille, toutes les cellules contiendront des données (pas éparses).
J'ai fait une petite série de tests pour comparer deux conceptions: l'une utilisant EAV et l'autre utilisant un Postgres ARRAY pour stocker les données de cellule.
EAV
Tableau
Les deux schémas ont des index sur les colonnes appropriées et les index sont utilisés par le planificateur.
Il s'est avéré que le schéma basé sur un tableau était un ordre de grandeur plus rapide pour les insertions et les requêtes. À partir de tests rapides, il semble que les deux évoluent de manière linéaire. Les tests ne sont cependant pas très approfondis. Les suggestions et les fourchettes sont les bienvenues - elles sont sous une licence MIT.
la source