2009-12-22 1 views
2

У меня есть приложение для рельсов, которое отслеживает владельцев карт-участников и должно сообщать о статусе владельца карты. Статус определяется - по бизнес-правилу - как «добросовестно», «просрочено» или «отменен», в зависимости от того, был ли оплачен последний счет держателя карты.Рекомендации по обработке полей статуса объекта в приложениях rails: хранить или вычислять?

Счета-фактуры отправляются за 30 дней, так что клиент, который только что выставил счет, по-прежнему находится в хорошем состоянии, тот, у кого 20 дней после истечения срока платежа, имеет задолженность и член, который не оплатил свой счет больше чем через 30 дней после его погашения.

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

Рекомендации? Или другие идеи, о которых я не думал?

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

ответ

2

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

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

Когда вы делаете рефакторинг и сохраняете значение в БД, вы, вероятно, захотите, чтобы пакетное задание проверяло значение целостности данных на регулярной основе.

0

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

Если и только если ваши измерения показывают, что этот расчет вызывает значительное замедление, вы можете подумать о кешировании значения.

0

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

Возможная проблема заключается в том, что он не синхронизирован, поэтому я добавил несколько дочерних моделей и after_destroy, чтобы синхронизировать их. И, конечно, если кто-то изменит базу данных по-разному, это создаст некоторые проблемы.

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

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

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