Как вы моделируете таблицу для конвертации единиц? - PullRequest
9 голосов
/ 18 октября 2010

Я хочу создать модель БД для различных юнитов и их отношения друг к другу. Например, 36 дюймов = 3 фута = 1 ярд = .9144 метра и т. Д. В этой таблице также будут храниться чашки в унциях, фунтах, килограммах, граммах, см и все виды измерений.

Как ты это делаешь? Я думал о чем-то вроде этого:

Amount | Units | ConversionFactor | ConversionUnits
1      | foot  | 12               | inches
1      | yard  | 36               | inches

Но, честно говоря, это кажется ужасной идеей. Попытка выяснить, сколько футов во дворе будет очень запутанным, и я не думаю, что смогу когда-либо сохранить все необходимые мне преобразования.

Какие еще идеи есть? Я знаю, что это решенная проблема. Спасибо!

Ответы [ 4 ]

7 голосов
/ 18 октября 2010

Хранить преобразования в единицах СИ , а не в другие неметрические единицы.Затем вы можете конвертировать между единицами измерения без необходимости явного преобразования.

Unit         | Class      | Base Unit Multiplier
------------------------------------------------------
foot         | length     | 0.304800610
yard         | length     | 0.914401830
square foot  | area       | 0.092903040
...

Таким образом, 14 футов в ярдах:

14 feet * 0.304800610 = 4.26720854 meters
4.26720854 meters * 0.914401830⁻¹ = 4.66666667 yards
4 голосов
/ 18 октября 2010

Выберите базовую единицу для каждого измерения , которое вас интересует (прочитайте эту вики-страницу, это будет полезно).Например, если большая часть ваших данных представлена ​​в единицах СИ, вы должны выбрать килограмм для массы, секунду для времени, метр для расстояния и так далее.Если большая часть ваших данных представлена ​​в единицах США, выберите единицы из обычных единиц США , например, фунт за массу, фут за длину, секунды за время.

Затем сохраните для каждого фактическогоединица измерения, которую вы хотите обрабатывать, коэффициент преобразования в размерно-подходящий базовый блок.Поэтому, если вы выбираете фут в качестве базовой единицы расстояния, сохраните значение

Unit    Dimension    Factor
Foot    Distance     1
Metre   Distance     3.28084
Mile    Distance     5280

. Чтобы действительно выполнить преобразование, после того как вы проверили, что размеры совпадают, просто умножьте на Factor единицы измерения,и разделите на Factor пункта назначения.Например, чтобы перейти от метров к милям, умножьте на 3,28084, а затем разделите на 5280.

2 голосов
/ 29 июня 2016
CREATE TABLE UnitConversion
(
    [FromUnit] NVARCHAR(100),
    [ToUnit] NVARCHAR(100),
    [FromOffset] DECIMAL(29,10),
    [Multiplicand] DECIMAL(29,10),
    [Denominator] DECIMAL(29,10),
    [ToOffset] DECIMAL(29,10)
)

ToUnit = (FromUnit + FromOffset) * Мультипликатор / знаменатель + ToOffset

2 голосов
/ 18 октября 2010

Я думаю, что предложенная схема оригинального поста в порядке, не считая Class (как в ответе Сета) - вы не хотите пытаться конвертировать между пинтами и дюймами.

Преобразование между двумя единицами, гдени одна из них не является единицей конверсии, просто получается путем извлечения записей конверсии обеих единиц и деления одного коэффициента на другой (например, 36/12 = 3 фута в ярде).

Если вас особенно беспокоитТочность, вы могли бы гарантировать, что все юниты для данного класса имеют записи для всех других юнитов в том же классе - это выглядит как избыточное убийство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...