Я создал подсистему базы данных для обработки единиц измерения давным-давно (хорошо, я немного преувеличиваю; хотя это было около 20 лет назад). К счастью, он имел дело только с простой массой, длиной, временными измерениями, а не с температурой, не с электрическим током, не со светимостью и т. Д. Игровой стороной игры было не так просто - было множество различных способов конвертации одной валюты. и другой в зависимости от даты, валюты и периода, в течение которого действовал обменный курс. Это было обработано отдельно от физических единиц.
По сути, я создал таблицу «показатели» со столбцом «id», именем единицы измерения, аббревиатурой и набором показателей степени - по одной для массы, длины и времени. Это заполняется такими именами, как «объем» (длина = 3, масса = 0, время = 0), «плотность» (длина = 3, масса = -1, время = 0) и т. П.
Была вторая таблица единиц, в которой указана мера, а затем фактические единицы измерения, использованные в конкретном измерении. Например, там были бочки и кубометры, и всякие другие релевантные единицы.
Была третья таблица, в которой определялись коэффициенты пересчета между конкретными единицами. Он состоял из двух единиц и коэффициента мультипликативного преобразования, который преобразовал единицу 1 в единицу 2. Самой большой проблемой здесь был динамический диапазон коэффициентов преобразования. Если преобразование из U1 в U2 равно 1.234E + 10, то обратное число является довольно небольшим числом (8.103727714749e-11).
Комментарий С. Лотта о температурах интересен - нам не приходилось с этим сталкиваться. Хранимая процедура могла бы решить эту проблему - хотя интеграция одной хранимой процедуры в систему могла бы быть сложной.
Схема, которую я описал, позволила описать большинство преобразований один раз (включая гипотетические единицы, такие как фарлонги за две недели или менее гипотетические, но одинаково неясные - за пределами США - как акр-футы), и преобразования можно было проверить (для Например, обе единицы в таблице коэффициентов пересчета должны иметь одинаковую меру). Он может быть расширен для обработки большинства других единиц, хотя безразмерные единицы, такие как углы (или телесные углы), представляют некоторые интересные проблемы. Был поддерживающий код, который обрабатывал бы произвольные преобразования - или генерировал ошибку, когда преобразование не могло быть поддержано. Одной из причин этой системы было то, что различные международные аффилированные компании сообщали свои данные в своих удобных для них единицах, но система HQ должна была принимать исходные данные и в то же время представлять итоговые агрегированные данные в единицах, подходящих для менеджеров, где каждый из менеджеров по отдельности У них была своя идея (исходя из их национальной принадлежности и стажа работы в штаб-квартире) о лучших единицах для их отчетов.