2009-09-08 3 views
3

Еще один вопрос от программиста, который пытается в первый раз собрать вместе модель БД.Модель базы данных и расчетный баланс, mysql

В моем приложении есть пользователи, учетные записи и транзакции. Сначала у меня были все таблицы в 3NF (или, как я полагаю). Затем я решил добавить поле баланса для пользователей, главным образом потому, что мой код будет работать с открытым исходным кодом, и я не хочу, чтобы люди испортили бизнес-логику системы, изменив код PHP. Таким образом, триггеры и хранимые процедуры обновляют баланс.

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

Как это сделать? В моем текущем эскизе решения отображается таблица balance_history с внешними ключами для transaction_id и user_id. Любое другое предложение? Благодарю.

ответ

1

Если таблица транзакций не очень большая, я рекомендую удалить столбец баланса из таблицы пользователей. Для чего balance_history, если у вас уже есть таблица транзакций? И я ВЫСОКО рекомендую вам удалить любую логику бизнеса из триггеров! Только хранимые процедуры. Я рекомендую использовать триггеры только для истинных прозрачных операций (аудит, сложные проверки и т. Д.). Итак, я думаю, что вы sholuld удалите столбец баланса из таблицы пользователей и вместо этого напишите представление (например, UserBalance), соединяющее пользователей и таблицу транзакций. Удалите любую логику бизнеса из триггеров, вместо этого вызовите aprobate хранимые процедуры. Используйте только таблицу транзакций для отображения истории баланса. Все это верно для не очень больших таблиц (3-4 миллиона записей в порядке). Для очень больших баз данных вам понадобятся распределенные кэши, вертикальные базы данных и т. Д.

0

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

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

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

Предложение Алексея Свиридова об использовании взглядов для ходовых балансов является хорошим, хотя они могут быть сложными для написания (особенно для эффективной работы). Аналитические функции Oracle действительно хороши для такого рода вещей, но я не уверен, есть ли у MySQL эквивалент.

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

  • Нет связанных вопросов^_^