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

Comment gérer les unités de mesure dans une application web PHP ?

L'explication du problème est un peu vague et je ne suis pas sûr de la portée de l'application, mais du point de vue de l'architecture du système, si vous utilisez un framework MVC, vous voudrez probablement conserver toutes vos unités de base de données le identique et créez un contrôleur UnitConversion. Ce contrôleur prendrait l'unité standard comme entrée et sortirait une valeur basée sur l'unité souhaitée. Un indicateur serait conservé sur votre dossier d'utilisateur/client dans la base de données pour vous faire savoir quelle unité ils préfèrent afin que vous ne perdiez pas ces informations entre les connexions. Transmettez la valeur dans un format d'unité standard (par exemple, mètres) et le drapeau de l'unité souhaitée (par exemple, « PIEDS ») dans votre contrôleur et laissez-le faire la conversion et renvoyer une valeur.

Je n'essaierais pas de conserver différents types d'unités dans la base de données, car vous finirez probablement par écrire toutes sortes de codes en essayant de gérer les exceptions et la maintenance (mise à jour de toutes les valeurs lorsque les clients changent d'unités, par exemple). Gardez une unité standard dans la base de données et effectuez les conversions via une classe php similaire à la façon dont le Zend Framework mentionné par Robert le fait. Googler "conversion d'unité php" fera apparaître certaines classes qui peuvent répondre à vos besoins.

À LA MISE À JOUR :

Je ne suis toujours pas sûr de voir tout le problème, mais je vais essayer de répondre du mieux que je comprends. Comme auparavant, il est préférable de conserver 1 système d'unités dans la base de données, par exemple, métrique. Le measure_type dans user_pref indique ce que le client veut, dites 'IMPERIAL'. En fonction de l'étendue de votre base de données, vous pouvez choisir l'une des deux solutions suivantes pour conserver les valeurs :

  1. Pour les éléments de votre base de données, vous pouvez avoir différentes propriétés (colonnes), comme le poids, la taille, le volume, etc.

  2. Vous pourriez avoir une table Item qui contient des éléments. Ensuite, vous avez une table de propriétés qui contient des propriétés. La table des propriétés comporte 4 colonnes :property_id (clé primaire), property (HEIGHT, WIDTH, LENGTH, WEIGHT), property_type (SIZE, MASS, VOLUME, SUPERBE) et value. Ensuite, vous avez une table Property_Lookup qui a 2 colonnes :item_id, property_id et une jointure entre ces 3 tables vous donnera toutes les valeurs et les types d'unités de chaque propriété appartenant à un élément. Dans ce schéma, je conserverais toujours toutes les entrées de la colonne "valeur" dans un système à une seule unité (dans cet exemple de métrique). Voir ce lien pour en savoir plus sur les relations plusieurs-à-plusieurs (http ://www.tomjewett.com/dbdesign/dbdesign.php?page=manymany.php ).

Vos modèles récupéreront les données et encapsuleront ces propriétés dans une unité { system(METRIC*,IMPERIAL,BOTH); type(TAILLE, MASSE, VOLUME); valeur } mini-Modèle. Transmettez-le à votre contrôleur. Lors du rendu, votre vue attendra une valeur d'unité basée sur ce que le client veut, donc lorsque votre contrôleur rassemble des données pour votre vue, il enverra des objets Unit via la bibliothèque UnitConversion. La bibliothèque UnitConversion vérifiera le modèle utilisateur pour le système préféré du client et le "système" dans le modèle d'unité et effectuera la conversion nécessaire (puisque la bibliothèque peut supposer que le système dans le modèle d'unité est métrique lorsqu'il provient de la base de données, cela rend cela étape un peu plus facile). Il affichera alors un nombre dans l'unité correcte (unités si les DEUX sont choisis), qui peut être transmis à la vue.

Un mot rapide sur ce qui précède est que, lorsqu'il s'agit d'architecture système, il n'y a toujours pas de solution "correcte" à un problème. C'est ainsi que j'organiserais les choses en fonction des informations fournies, mais vous devrez probablement les modifier un peu pour qu'elles correspondent parfaitement à ce avec quoi vous travaillez. Cela dit, je modifierais ce qui précède pour qu'il fonctionne dans votre système, et je ne modifierais pas votre système pour que ce qui précède fonctionne ! J'espère que cela vous donnera de bonnes idées.