Il n'y a pas de règle générale pour toutes les situations. De nombreux facteurs affectent la performance et l'efficacité des sites Web. Il n'y a donc pas de "meilleur".
Si vous regardez quelque chose comme Magento, il le fait dans les deux sens. D'une part, il a une structure complète d'EAV avec chaque élément de données extrait et normalisé au nième degré. D'un autre côté, il agrège également les valeurs pré-calculées dans les tables plates pour des raisons de performances. Cela inclut les montants des escomptes, les prix de base, les quantités fiscales (en devise de base et choisie), etc. La première situation est la meilleure en termes de flexibilité et de robustesse, la table plate est meilleure en termes de performance.
Une table plate accélère évidemment les calculs de masse, car tout a déjà été élaboré. Mais comme le souligne kernelpanic, cela signifie que toute modification des paramètres peut nécessiter un recalcul de toutes les valeurs. Dans le cas de données historiques telles que l'historique des commandes, vous ne voudrez probablement pas recalculer les montants réels payés par les utilisateurs, mais la possibilité d'avoir à le faire doit être prise en considération lors de la détermination de la meilleure solution.
Si les performances sont primordiales et que les calculs sont coûteux à exécuter, sachant que vous devrez peut-être actualiser les valeurs en masse de temps en temps, vous pourrez prendre une décision éclairée de les mettre en cache ou non.Mais si ce n'est pas un aspect critique des performances ou si les calculs sont coûteux mais ne sont pas exécutés souvent, il est préférable de les laisser hors de la base de données.
Encore une fois il y a plus d'une façon de définir «meilleur», donc cela dépend des circonstances. Il s'agit simplement d'équilibrer les exigences - rapidité, propreté, utilisation de la mémoire, besoins du processeur, utilisation de l'espace disque, nécessité de s'adapter à une structure de données arbitraire définie par les responsables du développement - votre décision devra tenir compte de ces facteurs.
Sans un problème du monde réel à traiter, la spéculation est vraiment tout ce qui peut être donné. Si vous avez une situation plus complexe, je serais heureux de jeter un coup d'oeil et offrir mes pensées.
edit: D'après mes propres observations, une page de catalogue Magento avec des données à plat et plus de 200k produits se charge en 10 à 20 secondes sans mise en cache de page activée. Lorsque les données à plat étaient désactivées et que la structure EAV était utilisée, cela prenait quelques minutes. Je ne suis pas au travail en ce moment, donc je n'ai pas mes données de profilage à portée de main, mais c'est un témoignage du fait que dans les applications du monde réel, il n'y a pas de meilleure solution.
[Faire des calculs dans MySQL vs PHP] (http://stackoverflow.com/questions/6449072/doing-calculations-in-mysql-vs-php) –
@DanLee, c'est-à-dire effectuer des calculs dans MySql, le mien est stocké la valeur dans une autre colonne. – Namit
Si vous ajoutez une autre colonne et que vous devez vous soucier de 2 tables lors de la mise à jour, je m'en tiendrai à la solution de jointure. Parce que cela peut devenir salissant –