2012-03-22 4 views
0

Я имею дело с клиническим применением, которое использует как базовые, так и производные единицы измерения.Хранение и управление единиц измерения

В настоящее время мы сохраняем их как текстовое поле в отдельном столбце в каждой таблице, где требуются единицы. Тем не менее, я планирую перепроектировать базу данных, чтобы мы имели все единицы измерения в одной таблице и использовали внешние ключи в таблице, которые требуют UOM.

Этот вид решения этой проблемы на уровне базы данных. Тем не менее, в коде Java, мы используем строку для хранения единицы, как так:

class Foo{ 
    double amount; 
    String unit; 
} 

Я представляю себе, используя строку для хранения единиц может стать кобыла ночи идти вперед. Мне нужны предложения по чистому способу управления единицами измерения, чтобы я мог, скажем, сравнить два Foos или добавить два Foos, убедившись, что они имеют одинаковые единицы и т. Д.

+0

Не могли бы вы иметь классы, которые отображают единицы измерения в базе данных и использовать их напрямую? –

+0

@ManuLetroll действительно ли это поражает базу данных? – Woot4Moo

+0

Ну, может быть, нет, но это самая логичная вещь ИМО. –

ответ

1

Я думаю, что у вас должна быть лучшая абстракция, чем строка; это немного больше, чем примитив.

Я бы написал класс Units, который будет анализировать и хранить эти строки из базы данных и позволять вам легко сравнивать их.

public class Units { 
    private final String name; 

    // constructors, equals, hashCode, toString and other operations here 
} 

Возможно, было бы полезно иметь категории единиц. (Вы можете измерить давление многими способами.) Британские и международные подразделения могут описывать одно и то же.

Вы также можете иметь категории на основе физических величин (например, сил, массы, заряд, время и т.д.)

+0

Это не решает, как поддерживать систему на уровне базы данных. Это также, вероятно, ненужная абстракция. Более абстракция означает большую сложность, а большая сложность означает больше проблем и больше ошибок. Если нет убедительного случая, когда важно знать, является ли это американской единицей или британским подразделением или французским подразделением, это, скорее всего, больше проблем, чем того стоит. – PlexQ

+0

Я не согласен. Лучшая абстракция не является ненужной проблемой. И как ваши единицы перечисляют улучшение? Не существует французских и американских единиц, как знал бы любой ученый, но есть метрические и британские (например, кг против lbm). Будете ли вы иметь давление, время и все другие типы единиц в вашем перечислении? Мне это кажется хуже. OP явно задал вопрос о конверсиях. Ваше перечисление не помогает вообще. – duffymo

+0

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

0

Я бы порекомендовал JScience library, который является реализацией от JSR 275.

По this post это может делать такие вещи, как:

UnitConverter toKilometers = MILE.getConverterTo(KILOMETER); 
double km = toKilometers.convert(Measure.valueOf(100, MILE).doubleValue(MILE)); 

Если вы не хотите, чтобы добавить новую библиотеку нет ничего плохого в использовании String объектов в пределах класса. Если вы никогда не собираетесь выполнять вычисления на них, есть еще меньше беспокоиться. Однако вам, скорее всего, понадобится использовать Double, так как это будет способ получить «правильные» переводы в метрическую систему и из нее.

+0

Я бы, конечно, рассмотрел JScience для преобразования и т. Д. Однако мне также нужно было бы сопоставить каждое значение UOM, которое я сохранил в базе данных, для класса JScience.Мне интересно, стоит ли вносить новую библиотеку или я могу решить проблему с помощью домашнего решения. – user330973

+0

Я целый день смотрю на различные библиотеки JSR и библиотеки. Ни один из них не подходит для сериализации, которая действительно там, где нужна библиотека. Я не знаю, что обладало созданием всего этого кода, не используя перечисления для единиц, но это именно то, что произошло. –

0

вопросов преобразования в стороне, перечисления являются справедливым способом решения этой проблемы:

enum Units { 
    Kilograms,Pounds,Stone 
} 

class Foo { 
    double amount; 
    Units units; 
} 

Большинство ORM преобразуют перечисление в строку. Ваша Java безопасна по типу, и вы можете сделать базу данных согласованной с помощью простого контрольного ограничения. Практически все RDBMSes поддерживают их.

Если вам нужно быть более сложным, есть способы, но часто более сложные просто означает, что больше неприятностей не обязательно будет лучше.

+0

Мой первый выбор был также перечислением, но я был обеспокоен проблемами целостности, когда нам нужно добавьте больше единиц в будущем. – user330973

+0

Ну, другое решение не обеспечивает никакого улучшения целостности. Новая случайная единица могла быть вставлена ​​в эту таблицу, так как некорректная строка могла быть вставлена ​​как строка в основной. Для обеспечения согласованности в любом случае вам все равно потребуется ограничение проверки. – PlexQ

+0

Целостность базы данных является заботой дизайнера схемы. И никакая схема не позволит вам ввести неправильные единицы. – duffymo

Смежные вопросы