Обновление денормализованных таблиц базы данных - PullRequest
0 голосов
/ 29 июня 2011

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

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

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

Ответы [ 2 ]

1 голос
/ 30 июня 2011

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

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

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

1 голос
/ 29 июня 2011

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

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