Использование целых чисел и требование умножения против использования десятичных чисел в качестве типа данных - что вы думаете? - PullRequest
0 голосов
/ 10 февраля 2009

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

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

Ответы [ 4 ]

4 голосов
/ 10 февраля 2009

«Как вы думаете, это хорошая или плохая идея?»

Bad.

«Должен ли я сохранить структуру данных, идентичную той, которую предоставляет поставщик?»

номер

«Должен ли я сделать столбцы базы данных истинными десятичными?»

Да.

Намного проще делать то, что правильно. В настоящее время данные передаются без "." отделить целые числа от десятичных знаков; это не имеет никакого реального значения.

Данные являются десятичными. Десятичная математика работает. Используйте десятичную математику, предоставленную вашим языком и базой данных. Не изобретайте свою собственную версию десятичной арифметики.

1 голос
/ 10 февраля 2009

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

0 голосов
/ 11 февраля 2009

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

Данные, хранящиеся в таблицах, должны иметь четкое значение без необходимости произвольных манипуляций. Если требуется манипулирование, должно быть четко видно, что оно есть (например, из названия поля).

Я недавно имел дело с данными, где дни недели хранились как значения 2-8. Вы не можете себе представить, как это произошло (тестирование не показало проблему по разным причинам, но использование в реальном времени вызвало политические взрывы).

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

0 голосов
/ 10 февраля 2009

Педантично: они также не хранятся как целые. Это строки, которые требуют разбора.

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

В некоторых сценариях вам не разрешено преобразовывать данные, например, вы можете ответить на вопрос: «Что было в файле?». В этих сценариях данные должны быть записаны в виде строки - если анализ не удастся, у вас не будет точного представления файла.

...