В моей базе данных есть таблица users.
Среди всех прочих, в таблице users имеются два столбца:
Balance - тип данных Decimal.
Currency - тип данных Enum, содержащей в себе четыре допустимых строковых значения: "RUB, "UAH", USD", "EUR".
В Balance хранятся данные о деньгах в долларовом эквиваленте.
Пользователь может отображать свой баланс в любой валюте. И он выбрал рубли.
Предположим, что пользователь пополнил баланс на 8000₽. На момент пополнения цена одного доллара за рубль была 80₽, поэтому в бд записывается ровно 100. На следующий день курс упал до 70₽.
Как объяснять пользователю, куда пропали его деньги?
Есть ли способы более логично хранить баланс при условии, что пользователь может пополнять посредством разных валют?
Вы не должны указывать куда пропали деньги, так как они не должны ни куда пропадать вообще.
Пользователь выбирает тип валют в которой будет хранить и курс никак на это влиять не должен.
Если пользователь хочет хранит в нескольких видах валюты, значит храните в нескольких типах валюты.
0NordWind0, потому что, если простым языком - вы должны избегать NULL или пустых значений в базах, если это возможно, а так же это упрощает разработку бизнес логики.
Рекомендую почитать книжки по SQL, например "Программирование баз данных SQL. Типичные ошибки и их устранение"
Иными словами, вы предлагаете сделать несколько столбцов:
balance_rub
balance_usd
Нужно спроектировать структуру базы так, чтобы появление новой единицы сущности не призывало менять структуру базы и ни строчки бизнес-логики.
Вы не должны добавлять столбцы при появлении новой валюты, только добавлять строки в различные таблицы.