Используя целые числа и требуя умножения по сравнениюиспользование десятичных дробей в качестве типа данных - что вы думаете?
-
22-08-2019 - |
Вопрос
Что вы думаете по этому поводу?Я работаю над интеграцией некоторых новых данных в текстовом формате, разделенном табуляцией, и все десятичные столбцы хранятся в виде отдельных целых чисел;чтобы определить десятичную сумму, вам нужно умножить это число на .01.Он делает это для таких вещей, как процентное соотношение, вес и информация о ценах.Например, цена товара выражается в виде 3259
в файлах данных, и когда я захочу отобразить его, мне нужно будет умножить его, чтобы получить "реальное" количество 32.59
.
Как вы думаете, это хорошая или плохая идея?Должен ли я сохранять свою структуру данных идентичной той, которая предоставляется поставщиком, или я должен сделать столбцы базы данных истинными десятичными числами и использовать SSIS или какой-либо процесс ETL для автоматического умножения целых столбцов в их десятичный эквивалент?На данный момент я еще не решил, буду ли я использовать ORM или Хранимые процедуры, или что для извлечения данных, поэтому я пытаюсь подумать о долгосрочной перспективе и решить, какой подход использовать.Я также мог бы легко просто обработать это в коде из DTO или аналогичном, что-то вроде:
public class Product
{
// ...
private int _price;
public decimal Price
{
get
{
return (this._price * .01);
}
set
{
this._price = (value / .01);
}
}
}
Но это кажется дополнительной и ненужной работой со стороны класса.Как бы вы подошли к этому, имея в виду, что данные предоставляются в целочисленном формате поставщиком, от которого вам регулярно нужно будет получать обновления.
Решение
"Как ты думаешь, это хорошая или плохая идея?"
Плохой.
"Должен ли я сохранять свою структуру данных идентичной той, что предоставлена поставщиком?"
Нет.
"Должен ли я сделать столбцы базы данных истинными десятичными числами?"
ДА.
Гораздо проще делать то, что правильно.В настоящее время данные передаются без "." для отделения целых чисел от десятичных дробей;это не имеет никакого реального значения.
Данные являются десятичными.Десятичная математика работает.Используйте десятичную математику, предоставляемую вашим языком и базой данных.Не изобретайте свою собственную версию десятичной арифметики.
Другие советы
Лично я бы предпочел, чтобы данные правильно хранились в моей базе данных, и просто выполнял простое преобразование каждый раз, когда приходит обновление.
Педантично:они также не хранятся как целые числа.Это строки, которые требуют синтаксического анализа.
Философски:у вас есть Информация в файле, и вы должны написать данные в базу данных.Это означает преобразование информации любыми способами, необходимыми для того, чтобы сделать ее значимой / полезной.Если вы не выполните это преобразование заранее, то вы будете обречены повторять преобразование для всех потребителей базы данных.
Существуют некоторые сценарии, в которых вам не разрешено преобразовывать данные, например, иметь возможность ответить на вопрос:"Что было в досье?".Эти сценарии потребовали бы, чтобы данные были записаны в виде строки - если синтаксический анализ завершится неудачей, у вас не будет точного представления файла.
На мой взгляд, наиболее важным аспектом использования Decimal вместо Int в этом сценарии является ремонтопригодность.
Данные, хранящиеся в таблицах, должны быть четко осмысленными без необходимости произвольных манипуляций.Если требуется манипуляция, должно быть четко видно, что это так (например, из названия поля).
Недавно я имел дело с данными, в которых дни недели хранились в виде значений 2-8.Вы не можете себе представить, к каким последствиям это привело (тестирование не выявило проблемы по целому ряду причин, но использование в реальном времени вызвало политические взрывы).
Если вы когда-нибудь столкнетесь с такой ситуацией, я был бы абсолютно уверен, что данные не могут быть записаны в таблицу или прочитаны из нее без использования хранимых процедур или представлений.Это позволяет вам убедиться, что необходимые манипуляции выполнены принудительно и задокументированы.Если у вас нет и того, и другого, какой-нибудь бедняга, который последует за вами в будущем, проклянет само ваше имя.