Maison >base de données >tutoriel mysql >Comment un schéma EAV modifié peut-il gérer efficacement les données historiques ?
Présentation
Alors que les bases de données EAV (Entity-Attribute-Value) sont souvent critiquées en raison de défauts de conception, un schéma EAV bien structuré offre une solution pratique pour suivre les données historiques et rationaliser l'échange de données entre SQL et les systèmes clé-valeur.
Schéma EAV amélioré pour la gestion des données historiques
Pour surmonter les limitations EAV courantes et optimiser la gestion des données historiques, un schéma modifié est proposé. Cette approche catégorise les attributs d'entité par type, permettant un stockage et une indexation efficaces de données d'attributs spécifiques.
Schéma de base de données
Le schéma comprend plusieurs tableaux :
entity_type : Stocke les types d'entités de base (par exemple, « produits », « utilisateurs »).
entité : Lie les entités à leurs types d'entités correspondants.
attr : Définit les attributs de l'entité avec des métadonnées (nom, type).
attr_option, option : Gère les attributs basés sur les options et leurs valeurs.
attr_int, attr_datetime, ... : Tables dédiées pour des types d'attributs distincts (entier, datetime, etc.).
attr_relation : Gère les relations de clés étrangères entre les entités.
Exemples de requêtes
Les requêtes SQL suivantes illustrent la récupération de données :
Récupérer le type d'entité :
<code class="language-sql"> SELECT * FROM entity_type et LEFT JOIN entity e ON e.entity_type_id = et.id WHERE e.id = ?</code>
Récupérer les attributs de l'entité :
<code class="language-sql"> SELECT * FROM attr WHERE entity_id = ?</code>
Récupérer les valeurs d'attribut les plus récentes :
<code class="language-sql"> SELECT * FROM attr_option WHERE entity_id = ? ORDER BY created_at DESC LIMIT 1 -- For single-value attributes SELECT * FROM attr_int WHERE entity_id = ? ORDER BY created_at DESC LIMIT 1 -- For integer attributes SELECT * FROM attr_relation WHERE entity_id = ? ORDER BY created_at DESC LIMIT 1 -- For relational attributes ...</code>
Récupérer les relations entre entités :
<code class="language-sql"> SELECT * FROM entity AS e LEFT JOIN attr_relation AS ar ON ar.entity_id = e.id WHERE ar.entity_id = 34 AND e.entity_type = 2;</code>
Défis potentiels
Malgré des améliorations, cette approche EAV modifiée présente certains défis :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!