Как сделать дополнительный поиск по архиву в рельсах, если запись не найдена, путем расширения модели? - PullRequest
1 голос
/ 24 марта 2010

Мне было интересно, знает ли кто-нибудь элегантное решение для следующего:

Предположим, у меня есть таблица, в которой хранятся заказы, с кучей данных.Так что я на 1M записей, и поиски начинают занимать время.Поэтому я хочу ускорить его, заархивировав некоторые данные более 3 лет - сохранив их в таблицу с именем orders-archive, а затем удалив их из таблицы orders.Поэтому, если нам нужно что-то исследовать или клиент хочет получить более старую информацию - они все еще могут, но 99% поисков выполняются по заказам не старше полутора лет - поэтому нет причин продолжать просматривать более старые данныевсе время.Эти операции перемещения и очистки могут затем выполняться еженедельно.Я уже провел несколько тестов, и я знаю, что время поиска сократится примерно в 4 раза.Пока все хорошо, правда?

Однако я думал о том, как реализовать более старые архивные поиски, и единственная разумная вещь, о которой я могу подумать, это что-то вроде if-else. Если не найдено в заказах, выполните поиск в архиве заказов.Тем не менее - у меня есть около 20 таблиц, которые я хочу заархивировать, и бог знает, сколько поисков / находок сделано в коде, которые я не хочу изменять.Поэтому мне было интересно, есть ли элегантное решение этой проблемы с помощью рельсовых путей, как-то расширить модель?Кто-нибудь имел дело с подобным случаем раньше?

Спасибо.

1 Ответ

1 голос
/ 24 марта 2010

MySQL 5.x может справиться с этим с помощью горизонтального разбиения.

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

Вы можете использовать столбец order_date или что-то подобное в качестве отсечки для ваших разделов. Это элегантное решение.

Обзор создания разделов в MySQL

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

...