Die Erklärung des Problems ist etwas vage und ich bin mir nicht sicher, in welchem Umfang die Anwendung stattfindet, aber aus Sicht der Systemarchitektur möchten Sie wahrscheinlich alle Ihre Datenbankeinheiten behalten, wenn Sie ein MVC-Framework verwenden gleich und erstellen Sie einen UnitConversion Controller. Dieser Controller würde die Standardeinheit als Eingabe nehmen und einen Wert basierend auf der gewünschten Einheit ausgeben. In Ihrem Benutzer-/Kundendatensatz in der Datenbank wird ein Flag gespeichert, das Sie darüber informiert, welche Einheit sie bevorzugen, damit Sie diese Informationen zwischen den Anmeldungen nicht verlieren. Übergeben Sie den Wert in einem Standardeinheitenformat (z. B. Meter) und das Flag der gewünschten Einheit (z. B. 'FEET') in Ihren Controller und lassen Sie ihn die Konvertierung durchführen und einen Wert zurückgeben.
Ich würde nicht versuchen, verschiedene Einheitentypen in der Datenbank zu behalten, da Sie wahrscheinlich alle Arten von Code schreiben werden, um die Ausnahmen und die Wartung zu verwalten (z. B. alle Werte aktualisieren, wenn Clients ihre Einheiten ändern). Behalten Sie eine Standardeinheit in der Datenbank und führen Sie die Konvertierungen über eine PHP-Klasse durch, ähnlich wie das von Robert erwähnte Zend Framework. Wenn Sie nach "php unit conversion" googeln, werden einige Klassen angezeigt, die Ihren Anforderungen entsprechen könnten.
BEI AKTUALISIERUNG:
Ich bin mir immer noch nicht sicher, ob ich das gesamte Problem sehe, aber ich werde versuchen, so gut wie möglich zu antworten. Wie zuvor ist es am besten, 1 Einheitensystem in der Datenbank zu behalten, z. B. metrisch. Der Measurement_type in user_pref sagt, was der Client will, sagen wir „IMPERIAL“. Je nachdem, wie weit Ihre Datenbank verteilt ist, können Sie eine von zwei Lösungen zum Speichern von Werten wählen:
-
Für Artikel in Ihrer Datenbank haben Sie möglicherweise unterschiedliche Eigenschaften (Spalten), wie Gewicht, Höhe, Volumen usw.
-
Möglicherweise haben Sie eine Artikeltabelle, die Artikel enthält. Dann haben Sie eine Eigenschaftstabelle, die Eigenschaften enthält. Die Property-Tabelle hat 4 Spalten:property_id(primary key), property(HEIGHT, WIDTH, LENGTH, WEIGHT), property_type(SIZE, MASS, VOLUME, AWESOMENESS) und value. Dann haben Sie eine Property_Lookup-Tabelle mit 2 Spalten:item_id, property_id und eine Verbindung zwischen diesen 3 Tabellen gibt Ihnen alle Werte und Einheitentypen jeder Eigenschaft, die zu einem Artikel gehört. In diesem Schema würde ich weiterhin alle Einträge in der Spalte „Wert“ in einem einzigen Einheitensystem (in diesem Beispiel Metrik) halten. Weitere Informationen zu Viele-zu-Viele-Beziehungen finden Sie unter diesem Link (http://www.tomjewett.com/dbdesign/dbdesign.php?page=manymany.php ).
Ihre Modelle rufen Daten ab und kapseln diese Eigenschaften in einer Einheit { system(METRIC*,IMPERIAL,BOTH); Typ (GRÖSSE, MASSE, VOLUMEN); Wert } Mini-Modell. Übergeben Sie das an Ihren Controller. Beim Rendern erwartet Ihre Ansicht einen Einheitenwert basierend auf den Wünschen des Clients. Wenn Ihr Controller also Daten für Ihre Ansicht zusammenstellt, sendet er Einheitsobjekte durch die UnitConversion-Bibliothek. Die UnitConversion-Bibliothek überprüft das Benutzermodell auf das bevorzugte System des Kunden und das „System“ im Einheitenmodell und führt die erforderliche Konvertierung durch (da die Bibliothek davon ausgehen kann, dass das System im Einheitenmodell metrisch ist, wenn es aus der Datenbank kommt, führt sie dies durch Schritt etwas leichter). Es wird dann eine Zahl in der richtigen Einheit ausgegeben (Einheiten, wenn BOTH ausgewählt ist), die an die Ansicht weitergegeben werden kann.
Ein kurzes Wort dazu:Wenn es um Systemarchitektur geht, gibt es immer keine „richtige“ Lösung für ein Problem. So würde ich die Dinge basierend auf den gegebenen Informationen organisieren, aber Sie müssen es wahrscheinlich ziemlich anpassen, damit es perfekt zu dem passt, womit Sie arbeiten. Das heißt, ich würde das Obige optimieren, um in Ihrem System zu arbeiten, und nicht Ihr System optimieren, um das Obige zum Laufen zu bringen! Ich hoffe, das gibt Ihnen einige gute Ideen.