Mysql
 sql >> Database >  >> RDS >> Mysql

Come gestire le unità di misura in un'applicazione web PHP?

La spiegazione del problema è un po' vaga e non sono sicuro dell'ambito dell'applicazione, ma dal punto di vista dell'architettura del sistema, se stai utilizzando un framework MVC, probabilmente vorrai mantenere tutte le tue unità di database stesso e creare un controller UnitConversion. Questo controller prenderebbe l'unità standard come input e emetterebbe un valore basato sull'unità desiderata. Verrebbe mantenuto un flag sul record utente/cliente nel database per farti sapere quale unità preferisce in modo da non perdere queste informazioni tra gli accessi. Passa il valore in un formato di unità standard (ad esempio, metri) e il flag dell'unità desiderata (ad esempio, 'FEET') nel controller e lascia che esegua la conversione e restituisca un valore.

Non proverei a mantenere diversi tipi di unità nel database poiché probabilmente finirai per scrivere tutti i tipi di codice cercando di gestire le eccezioni e la manutenzione (aggiornando tutti i valori quando i client cambiano le loro unità, ad esempio). Mantieni un'unità standard nel database ed esegui le conversioni tramite una classe php simile a come fa Zend Framework menzionato da Robert. Cercando su Google "conversione di unità php" verranno visualizzate alcune classi che potrebbero soddisfare le tue esigenze.

IN AGGIORNAMENTO:

Non sono ancora sicuro di vedere l'intero problema, ma cercherò di rispondere nel miglior modo possibile. Come prima, è meglio mantenere 1 unità di sistema nel database, diciamo, metrica. Il tipo_misurazione in user_pref dice cosa vuole il cliente, diciamo 'IMPERIAL'. A seconda di quanto è distribuito il tuo database, potresti scegliere una delle due soluzioni per contenere i valori:

  1. Per gli elementi nel tuo DB potresti avere diverse proprietà (colonne), come peso, altezza, volume, ecc.

  2. Potresti avere una tabella Item che contiene gli articoli. Quindi hai una tabella Property che contiene le proprietà. La tabella Property ha 4 colonne:property_id(chiave primaria), property(HEIGHT, WIDTH, LENGTH, WEIGHT), property_type(SIZE,MASS,VOLUME,AWESOMENESS) e value. Quindi hai una tabella Property_Lookup che ha 2 colonne:item_id, property_id e un join tra queste 3 tabelle ti darà tutti i valori e i tipi di unità di ciascuna proprietà appartenente a un Item. In questo schema manterrei comunque tutte le voci nella colonna "valore" in un sistema a unità singola (in questa metrica di esempio). Vedere questo collegamento per ulteriori informazioni sulle relazioni molti-a-molti (http://www.tomjewett.com/dbdesign/dbdesign.php?page=manymany.php ).

I tuoi modelli recupereranno i dati e incapsularanno queste proprietà in un sistema Unit {(METRIC*,Imperial,BOTH); tipo (DIMENSIONE, MASSA, VOLUME); valore } mini-Modello. Passalo al tuo controller. Al momento del rendering, la tua vista si aspetta un valore unitario in base a ciò che il cliente desidera, quindi quando il tuo controller sta mettendo insieme i dati per la tua vista invierà oggetti Unit attraverso la libreria UnitConversion. La libreria UnitConversion verificherà il modello utente per il sistema preferito del cliente e il "sistema" nel modello unità ed effettuerà la conversione necessaria (poiché la libreria può presumere che il sistema nel modello unità sia metrico quando proviene dal database, rende questo passo un po' più facile). Quindi emetterà un numero nell'unità corretta (unità se viene scelto ENTRAMBI), che può essere passato alla vista.

Una breve parola su quanto sopra è che sempre quando si ha a che fare con l'architettura di sistema non esiste una soluzione "corretta" a un problema. Questo è il modo in cui organizzerei le cose in base alle informazioni fornite, ma probabilmente dovrai modificarlo un po' per adattarlo perfettamente a ciò con cui stai lavorando. Detto questo, modificherei quanto sopra per funzionare nel tuo sistema e non modificherei il tuo sistema per far funzionare quanto sopra! Spero che questo ti dia delle buone idee.