Я работаю над веб-приложением LAMP, которое управляет множеством данных с различными единицами измерения. Это приложение php использует пользовательскую среду MVC. Теперь у нас есть клиенты в разных странах, и мы хотели бы предложить клиенту выбор между метрикой, империей или комбинацией.
В настоящее время все данные сохраняются в международной единице в нашей базе данных MySQL. В некоторых таблицах есть несколько столбцов, содержащих данные с разными единицами. Какая была бы лучшая архитектура БД для управления отображением всех данных в устройстве, выбранном клиентом (пользователем)?
Существуют ли какие-либо php-классы, php-функция или веб-сервис, которые могут нам помочь?
Благодаря!
ОБНОВИТЬ :
Если я решит использовать UnitConverter, как класс Zend Framework, каким будет наилучший способ определить единицу для каждого из данных, которые у меня есть в моей базе данных?
Объяснение проблемы немного расплывчато, и я не уверен в области применения приложения, но с точки зрения системной архитектуры, если вы используете структуру MVC, вы, вероятно, захотите сохранить все свои блоки базы данных и создать контроллер UnitConversion. Этот контроллер будет принимать стандартный блок в качестве ввода и выводить значение на основе желаемого устройства. Флаг будет храниться в вашей учетной записи пользователя / клиента в базе данных, чтобы вы знали, какой блок они предпочитают, чтобы вы не теряли эту информацию между входами. Передайте значение в стандартном единичном формате (скажем, метрах) и флаге желаемого устройства (скажем, «FEET») в свой контроллер и дайте ему выполнить преобразование и верните значение.
Я бы не пытался хранить разные типы блоков в базе данных, так как вы, вероятно, закончите писать все виды кода, пытаясь управлять исключениями и обслуживанием (обновляя все значения, когда клиенты меняют свои единицы, например). Храните стандартный блок в базе данных и делайте преобразования через класс php, аналогично тому, как это делает Роберт Zend Framework. Googling «Преобразование php единиц» приведет к появлению некоторых классов, которые могут удовлетворить ваши потребности.
ПО ОБНОВЛЕНИЮ:
Все еще не уверен, что я вижу всю проблему, но я постараюсь ответить как можно лучше. Как и прежде, лучше всего сохранить единую систему в базе данных, скажем, метрику. Функция measure_type в user_pref сообщает, что хочет клиент, например «IMPERIAL». В зависимости от того, насколько распространена ваша база данных, вы можете выбрать одно из двух решений для хранения значений:
Для элементов в вашей БД могут быть разные свойства (столбцы), такие как вес, высота, объем и т. Д.
У вас может быть таблица товаров, в которой хранятся элементы. Затем у вас есть таблица свойств, которая содержит свойства. В таблице свойств есть 4 столбца: property_id (первичный ключ), свойство (HEIGHT, WIDTH, LENGTH, WEIGHT), property_type (SIZE, MASS, VOLUME, AWESOMENESS) и значение. Затем у вас есть таблица Property_Lookup, которая имеет 2 столбца: item_id, property_id и соединение между этими тремя таблицами даст вам все значения и типы единиц каждого свойства, принадлежащего элементу. В этой схеме я все равно сохранил бы все записи в столбце «значение» в единичной системе (в этом примере метрика). См. Эту ссылку для получения более подробной информации о взаимоотношениях «многие ко многим» ( http://www.tomjewett.com/dbdesign/dbdesign.php?page=manymany.php ).
Ваши модели будут извлекать данные и инкапсулировать эти свойства в системе Unit {METRIC *, IMPERIAL, BOTH); Тип (Размер, масса, объем); значение} мини-модель. Передайте это своему контроллеру. При визуализации вашего представления будет ожидаться значение единицы измерения на основе того, что хочет клиент, поэтому, когда ваш контроллер собирает данные для вашего представления, он будет отправлять объекты Unit через библиотеку UnitConversion. Библиотека UnitConversion проверит модель User для предпочтительной системы клиента и «систему» в модели Unit и сделает необходимое преобразование (поскольку библиотека может предположить, что система в модели Unit является метрикой при выходе из базы данных, она делает это шаг немного легче). Затем он выведет число в правильном блоке (единицы, если выбрано BOTH), которые могут быть переданы в представление.
Краткое изложение сказанного состоит в том, что всегда при работе в системной архитектуре нет «правильного» решения проблемы. Вот как я мог бы организовать вещи, основанные на приведенной информации, но вам, вероятно, придется немного подкорректировать ее, чтобы она идеально соответствовала тому, с чем вы работаете. Тем не менее, я бы подстроил выше, чтобы работать в вашей системе, а не настраивать вашу систему, чтобы заставить выше работать! Надеюсь, это даст вам несколько хороших идей.
посмотрите Zend Component Zend_Measure