Обновление денормализованных таблиц базы данных

Я использую Ruby on Rails 3.0.7 и MySQL 5. В моем приложении у меня есть две таблицы базы данных, скажем, TABLE1 и TABLE2, и по соображениям производительности я денормализовал некоторые данные в TABLE2, чтобы в них я повторил значения TABLE1. Теперь в TABLE1 мне нужно обновить некоторые из этих задействованных значений и, конечно же, я должен корректно обновить также денормализованные значения в TABLE2.

Что я могу сделать, чтобы обновить эти значения быстрым способом? То есть, если TABLE2 содержит много значений (1.000.000 или более), каков наилучший способ обновления обеих таблиц (методы, практики, ...)?

Что может произойти за время, необходимое для обновления таблиц базы данных? Например, у пользователя могут возникнуть проблемы при доступе к некоторым страницам веб-сайта, содержащим эти денормализованные значения? Если да, что это такое и как я могу справиться с ситуацией?

2 ответа

Решение

Есть несколько способов справиться с этой ситуацией:

  1. Вы можете использовать триггер базы данных. Это не независимый от базы данных вариант, и насколько мне известно, его поддержка RoR отсутствует. Если ваша ситуация не требует абсолютно никакой несогласованности данных, вероятно, это будет наиболее эффективный способ достижения вашей цели, но я не эксперт по БД.
  2. Вы можете использовать пакетную операцию для периодической синхронизации двух таблиц. Этот метод позволяет вашим двум таблицам расходиться, а затем периодически повторять синхронизацию данных. Если ваша ситуация позволяет этому дрейфу произойти, это может быть хорошим вариантом, поскольку позволяет обновлять БД в нерабочее время. Если вам нужно выполнять синхронизацию каждые 5 минут, вы, вероятно, захотите посмотреть другие варианты. Это может быть обработано вашим кодом ruby, но для этого потребуется какой-либо фоновый запуск (cron, delayed_job, redis и т. Д.)
  3. Вы можете использовать обратный вызов изнутри вашей модели Rails. Ты можешь использовать "after_update :sync_denormalized_data", Этот обратный вызов будет включен в транзакцию на уровне базы данных (при условии, что ваша база данных поддерживает транзакции). У вас будет код уровня Rails, непротиворечивые данные и вам не понадобится фоновый процесс за счет выполнения двух записей каждый раз.
  4. Какой-то механизм, о котором я не думал....

Эти типы проблем очень специфичны для конкретного приложения. Даже в рамках одного и того же приложения вы можете использовать более одного метода в зависимости от требований к гибкости и производительности.

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

Другие вопросы по тегам