Используя целые числа и требуя умножения по сравнениюиспользование десятичных дробей в качестве типа данных - что вы думаете?

StackOverflow https://stackoverflow.com/questions/533951

Вопрос

Что вы думаете по этому поводу?Я работаю над интеграцией некоторых новых данных в текстовом формате, разделенном табуляцией, и все десятичные столбцы хранятся в виде отдельных целых чисел;чтобы определить десятичную сумму, вам нужно умножить это число на .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.Вы не можете себе представить, к каким последствиям это привело (тестирование не выявило проблемы по целому ряду причин, но использование в реальном времени вызвало политические взрывы).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top