Entity attribut Value Database vs. strict Relational Model Ecommerce

on peut 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 devrait être utilisé pour traiter les "classes" d'attributs décrivant les produits du 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 ont ensuite une résolution pour chaque TV, mais le prochain le produit 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 trouve que les clients recherchent généralement des téléviseurs en fonction de la profondeur de la console, vous pouvez ajouter la profondeur de la console à vos champs, puis Ajouter une seule profondeur pour chaque type de produit tv au moment de l'exécution.

Il ya une belle caractéristique commune parmi les bonnes applications e-commerce où ils montrent un ensemble de produits, puis ont des menus latéraux " Forez vers le bas "où vous pouvez voir" Résolution TV " comme un en-tête, et les cinq résolutions TV les plus courantes pour l'ensemble trouvé. Vous cliquez sur l'un d'eux et il n'affiche que des TVs de cette résolution, ce qui vous permet d'aller plus loin en sélectionnant d'autres catégories dans le menu latéral. Ces options seraient les attributs de produit dynamique ajoutés au moment de l'exécution.

suite de la discussion:

Si longue histoire courte, 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 proposé un tableau de catégories, mais le besoin peut être plus grand que cela. Je décris une manière différente, ci-dessous, en essayant de mettre en évidence l'importance. Je pourrais avoir besoin d'une correction de point de vue pour résoudre le problème, ou je pourrais avoir besoin d'aller plus profondément dans L'EAV/CR.

l'Amour de la réponse positive de l'EAV/CR modèle. Mes collègues les 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:

  • entités ajouter et supprimer les attributs hebdomadaire

    (mots-clés de recherche dicter 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ée, moins populaire, saisonnière)

le client veut ajouter des attributs aux produits pour deux raisons:

  • ministère / recherche par mot clé / tableau comparatif des produits similaires
  • configuration du produit de consommation avant la caisse

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 gâteaux, cliquez thème anniversaire, cliquez glaçage à la crème fouettée, puis vérifier tous les gâteaux qui sont intéressants en sachant qu'ils ont tous glaçage à la crème fouettée. Ce n'est pas spécifique à gâteaux, juste un exemple.

122
demandé sur Cœur 2009-05-16 00:48:35

10 réponses

il y a quelques avantages et inconvénients généraux dont je peux penser, il y a des situations où l'un est meilleur que l'autre:

Option 1, modèle EAV:

  • Pro: moins de temps pour concevoir et développer une application simple
  • Pro: nouvelles entités faciles à ajouter (pourrait même être ajoutés par les utilisateurs?)
  • Pro: "génériques" des composants de l'interface
  • Con: code complexe requis pour valider des types de données simples
  • Con: beaucoup plus complexe SQL pour simple rapports
  • Con: les rapports complexes peuvent devenir presque impossible
  • Con: des performances médiocres pour les grands ensembles de données

Option 2, modélisation de chaque entité séparément:

"
  • Con: plus de temps nécessaire pour rassembler exigences et conception
  • Con: nouvelles entités doit être modélisé et conçu par un professionnel
  • Con: composants d'interface personnalisés pour chaque entité
  • Pro: type de données de contraintes et de validation simple à mettre en œuvre
  • Pro: SQL est facile à écrire, facile à comprendre et contester
  • Pro: même les rapports les plus complexes sont relativement simples
  • Pro: meilleures performances pour les grands ensembles de données

L'Option 3, la Combinaison (entités du modèle "correctement", mais ajoutez "extensions" pour les attributs personnalisés pour certaines/toutes les entités)

  • Pro / Con: plus de temps requis pour recueillir les exigences et la conception que l'option 1, mais peut-être pas autant que l'option 2 *
  • Con: les nouvelles entités doivent être modélisées et conçues par un professionnel
  • Pro: de nouveaux attributs peuvent être facilement ajoutés plus tard dans
  • Con: code complexe requis pour valider des types de données simples (pour les attributs personnalisés)
  • Con: composants d'interface personnalisés encore nécessaires, mais des composants d'interface génériques peuvent être possibles pour les attributs personnalisés
  • Con: SQL devient complexe dès qu'un attribut personnalisé est inclus dans un rapport
  • Con: bonne performance en général, sauf si vous commencez besoin de rechercher ou de signaler par les attributs personnalisés

* Je ne suis pas sûr que L'Option 3 permettrait de gagner du temps dans la phase de conception.

personnellement, je pencherais vers l'option 2, et j'éviterais L'EAV dans la mesure du possible. Cependant, pour certains scénarios, les utilisateurs ont besoin de la flexibilité qui accompagne L'EAV; mais cela coûte cher.

71
répondu Jeffrey Kemp 2013-06-26 23:03:54

on peut dire que le modèle de base de données EAV/CR est mauvais.

Non, ça ne l'est pas. C'est juste qu'ils sont 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?

il suffit d'utiliser EAV. Dans votre cas, ce serait une seule table supplémentaire. l'indexer sur les deux attributs nom et valeur, la plupart des RDBMs utiliseraient la compression de préfixe sur l'attribut noms répétitions, ce qui le rend vraiment rapide et compact.

EAV / CR devient laid quand vous l'utilisez pour remplacer les 'vrais' champs. Comme pour tout outil, sa surutilisation est "mauvaise" et lui donne une mauvaise image.

57
répondu Javier 2009-05-15 21:44:54
// At this point, I'd like to take a moment to speak to you about the Magento/Adobe PSD format.
// Magento/PSD is not a good ecommerce platform/format. Magento/PSD is not even a bad ecommerce platform/format. Calling it such would be an
// insult to other bad ecommerce platform/formats, such as Zencart or OsCommerce. No, Magento/PSD is an abysmal ecommerce platform/format. Having
// worked on this code for several weeks now, my hate for Magento/PSD has grown to a raging fire
// that burns with the fierce passion of a million suns.

http://code.google.com/p/xee/source/browse/trunk/XeePhotoshopLoader.m?spec=svn28&r=11#107

modèles internes sont farfelus, au mieux, comme quelqu'un a mis le schéma dans un boggle jeu, scellé et mis dans une peinture shacker...

Real world: je travaille sur une application midware fulfilment et voici une des requêtes pour obtenir des informations d'adresse.

CREATE OR REPLACE VIEW sales_flat_addresses AS
SELECT sales_order_entity.parent_id AS order_id, 
       sales_order_entity.entity_id, 
       CONCAT(CONCAT(UCASE(MID(sales_order_entity_varchar.value,1,1)),MID(sales_order_entity_varchar.value,2)), "Address") as type, 
       GROUP_CONCAT( 
         CONCAT( eav_attribute.attribute_code," ::::: ", sales_order_entity_varchar.value )
         ORDER BY sales_order_entity_varchar.value DESC
         SEPARATOR '!!!!!' 
       ) as data
  FROM sales_order_entity
       INNER JOIN sales_order_entity_varchar ON sales_order_entity_varchar.entity_id = sales_order_entity.entity_id
       INNER JOIN eav_attribute ON eav_attribute.attribute_id = sales_order_entity_varchar.attribute_id
   AND sales_order_entity.entity_type_id =12
 GROUP BY sales_order_entity.entity_id
 ORDER BY eav_attribute.attribute_code = 'address_type'

indique l'adresse information pour une commande, par exemple

--

résumé: n'utilisez Magento que si:

  1. on Vous donne de grands sacs d'argent
  2. Vous devez
  3. Profiter de la douleur
15
répondu Vee 2010-09-28 14:26:36

je suis surpris que personne n'ait mentionné NoSQL.

Je n'ai jamais pratiqué NoSQL dans un contexte de production (Je viens de tester MongoDB et j'ai été impressionné) mais tout le point de NoSQL est d'être capable de sauvegarder des articles avec des attributs variables dans le même"document".

15
répondu Lucas T 2011-04-05 23:10:29

où la performance n'est pas une exigence majeure, comme dans un type D'application ETL, L'EAV présente un autre avantage: les gains différentiels.

j'ai mis en œuvre un certain nombre d'applications où une exigence majeure était la possibilité de voir l'histoire d'un objet de domaine de sa première" version " à son état actuel. Si l'objet de domaine a un grand nombre d'attributs, cela signifie que chaque changement nécessite une nouvelle ligne être inséré dans la table correspondante (pas une mise à jour, parce que l'histoire serait perdu, mais un insert). Disons que cet objet de domaine est une personne, et j'ai 500k personnes à suivre avec une moyenne de 100+ changements au cours du cycle de vie des personnes à divers attributs. Ajoutez à cela le fait que rare est l'application qui n'a qu'un seul objet de domaine majeur et vous supposerez rapidement que la taille de la base de données serait rapidement hors de contrôle.

une solution facile est de sauver seulement les modifications différentielles à les principaux objets du domaine plutôt que de sauvegarder à répétition des informations redondantes.

tous les modèles changent au fil du temps pour refléter les nouveaux besoins opérationnels. Période. À l'aide de la VAE est un des outils dans notre boîte à utiliser; mais il ne doit jamais être automatiquement classé comme "mauvais".

11
répondu Jerry Jasperson 2011-07-20 13:04:54

je me bats 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 (regular relational structure)): https://forum.virtuemart.net/index.php?topic=58686.0

il semble que la performance EAV de Magento soit un vrai showstopper.

C'est pourquoi je penche pour une structure normalisée. Pour surmonter le manque de flexibilité je pense à ajouter un dictionnaire de données séparé dans le futur (XML ou tables de DB séparées) qui pourrait être édité, et sur la base de cela, le code d'application pour l'affichage et la comparaison des catégories de produits avec de nouveaux ensembles d'attributs serait généré, ainsi que des scripts SQL.

une telle architecture semble être à la fois souple et performante.

le problème pourrait être l'utilisation fréquente D'ALTER TABLE en live environnement. J'utilise Postgres, donc son MVCC et son DDL transactionnel soulageront la douleur.

3
répondu aaimnr 2009-12-28 10:04:45

je vote toujours pour la modélisation au niveau atomique le plus bas-significatif pour L'EAV. Laisser les normes, les technologies et les applications qui s'orientent vers une certaine communauté d'utilisateurs pour décider des modèles de contenu, des besoins de répétition des attributs, des grains, etc.

2
répondu Amanda Xu 2010-05-07 16:58:43

si c'est juste au sujet des attributs de catalogue de produit et donc les exigences de validation pour ces attributs sont plutôt limités, le seul véritable inconvénient de L'EAV est la performance de requête et même qui est seulement un problème lorsque votre requête traite de multiples" choses "(produits) avec des attributs, la performance pour la requête" donnez-moi tous les attributs pour le produit avec id 234 " alors que pas optimal est encore beaucoup rapide.

une solution est d'utiliser la base de données SQL / modèle EAV seulement pour le côté admin / édition du catalogue de produits et avoir un certain processus qui dénormalise les produits en quelque chose qui le rend consultable. Puisque vous avez déjà des attributs et donc il est assez probable que vous voulez faceting, ce quelque chose pourrait être Solr ou ElasticSearch. Cette approche évite essentiellement tous les inconvénients du modèle EAV et la complexité ajoutée se limite à sérialiser un produit complet à JSON lors de la mise à jour.

2
répondu bob 2014-09-27 18:08:04

VAE a de nombreux inconvénients:

  1. dégradation des performances dans le temps Une fois que la quantité de données dans l'application dépasse une certaine taille, la récupération et la manipulation de ces données est susceptible de devenir de moins en moins efficace.
  2. les requêtes SQL sont très complexes et difficiles à écrire.
  3. problèmes D'intégrité des données. Vous ne pouvez pas définir des clés étrangères pour tous les champs nécessaires.
  4. vous avez définir et maintenir vos propres métadonnées.
2
répondu Gabriel Voinea 2015-05-06 12:53:41

j'ai un problème légèrement différent: au lieu de beaucoup d'attributs avec des valeurs éparses (ce qui est peut-être une bonne raison d'utiliser EAV), je veux stocker quelque chose plus comme une feuille de calcul. Les colonnes dans la feuille peut changer, mais à l'intérieur d'une feuille toutes les cellules contiennent des données (pas rare).

j'ai fait un petit ensemble de tests pour comparer deux conceptions: l'Une utilisant EAV, et l'autre utilisant un tableau de Postgres pour stocker des données de cellules.

EAV enter image description here

Array enter image description here

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 était un ordre de grandeur plus rapide pour les inserts et les requêtes. À partir de tests rapides, il semblait qui ont tous les deux escaladé linéairement. Les tests ne sont pas très approfondis. Les Suggestions et les fourchettes sont les bienvenues - elles sont sous licence MIT.

1
répondu z0r 2016-03-07 05:12:58