Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment récupérer des valeurs d'une structure MySQL 5.7 normalisée qui correspondent à certains critères

Vous avez utilisé une table Entity-Attribute-Value pour enregistrer vos attributs.

C'est le opposé de normalisation.

Nommez la règle de normalisation qui vous a guidé pour mettre différents attributs dans la même colonne. Vous ne pouvez pas, car ce n'est pas une pratique de normalisation.

Pour accomplir votre requête avec votre conception EAV actuelle, vous devez faire pivoter le résultat afin d'obtenir quelque chose comme si vous aviez votre table d'origine.

SELECT * FROM (
    SELECT 
         a.article_id,
         a.title, 
         MAX(CASE attr_group WHEN 'ref_id' THEN attribute END) AS ref_id,
         MAX(CASE attr_group WHEN 'dial_c_id' THEN attribute END) AS dial_c_id
         -- ...others...
    FROM test.articles_test a
    INNER JOIN attributes attr ON a.article_id = attr.article_id
    GROUP BY a.article_id, a.title) AS pivot
WHERE pivot.ref_id = '127712' 
  AND pivot.dial_c_id = 51 

Bien que la requête ci-dessus puisse produire le résultat souhaité, les performances seront terribles. Il doit créer une table temporaire pour la sous-requête, contenant toutes les données des deux tables , puis appliquez la clause WHERE à la table temporaire.

Vous êtes vraiment mieux avec chaque attribut dans sa propre colonne dans votre tableau d'origine.

Je comprends que vous essayez de permettre de nombreux attributs à l'avenir. C'est un problème courant.

Voir ma réponse àComment concevoir une table de produits pour de nombreux types de produits où chaque produit a de nombreux paramètres

Mais vous ne devriez pas l'appeler "normalisé", car ce n'est pas le cas. Ce n'est même pas dénormalisé . C'est dérélationnel .

Vous ne pouvez pas simplement utiliser des mots pour décrire tout ce que vous voulez - surtout pas le contraire de ce que le mot signifie. Je ne peux pas laisser sortir l'air de mon pneu de vélo et dire "Je le gonfle".

Vous avez indiqué que vous essayez de rendre votre base de données "évolutive". Vous comprenez également mal ce que signifie le mot "évolutif". En utilisant EAV, vous créez une structure où les requêtes nécessaires sont difficiles à écrire et inefficaces à exécuter, et les données prennent 10 fois plus d'espace. C'est le contraire d'évolutif.

Ce que vous voulez dire, c'est que vous essayez de créer un système extensible . C'est complexe à implémenter en SQL, mais je décris plusieurs solutions dans l'autre réponse Stack Overflow à laquelle j'ai lié. Vous aimerez peut-être aussi ma présentation Modélisation extensible des données avec MySQL .