[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Архивирование данных по годам
Yulk
Есть база данных MYSQL в которой очень много всего и программа на php чтоб со всем этим работать. Вопрос такой - надо каждый год все данные "архивировать" и начинать работать как бы с пустой базой, но в любой момент нужно иметь возможность посмотреть и исправить старые данные. Пожалуйста, подскажите идеи - как это сделать, никогда с такой задачей не сталкивалась... Сначала возникла идея - каждый год создавать новую базу, а к старой подключаться по необходимости... Но тогда путаница получится с конфигурационным файлом... или есть способ сделать по-другому? unsure.gif



Спустя 4 минуты, 22 секунды (5.06.2009 - 15:09) Joker написал(а):
А как вариант, сделать два поля, первое будет говорить, чтоб данные уже в архиве второе за какой год.

Спустя 10 минут, 25 секунд (5.06.2009 - 15:19) sergeiss написал(а):
Можно сделать, как Джокер сказал. Минус в том, что таблицы будут расти и расти. А это приведет к замедлению работы. Подчеркиваю, что я сознательно говорю про размер именно таблиц, а не всей БД.

Другой вариант - данные за определенный год переписывать в другую таблицу этой же БД. Тогда:
1. Не будет проблем с конфигурационными файлами.
2. Данные всегда доступны.
3. Если необходимо, можно легко и просто выбрать старые и новые данные одним запросом.
4. Единственный "минус" - надо отработать систему просмотра старых данных.

Спустя 5 минут, 22 секунды (5.06.2009 - 15:25) Yulk написал(а):
Joker
Ну да, вроде бы так и надо сделать,я б и не сомневалась, если б задача ставилась в начале написания программы...А теперь получится в каждый запрос еще и год надо вставить, а их ооооочень много, очень много переделывать придется... может еще какой-нибудь способ? чтоб поменьше в коде менять? unsure.gif

Спустя 3 минуты, 56 секунд (5.06.2009 - 15:29) Yulk написал(а):
sergeiss
то есть создать например те же таблицы с префиксом 2009_ и туда все переписать? тогда чтоб поработать со старыми данными, надо будет уже к другим таблицам обращаться? опять менять запросы?

Спустя 14 минут, 9 секунд (5.06.2009 - 15:43) glock18 написал(а):
зачем менять запросы?
sergeiss же сказал
Цитата
4. Единственный "минус" - надо отработать систему просмотра старых данных.


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

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

Спустя 2 минуты, 25 секунд (5.06.2009 - 15:45) Joker написал(а):
Нужно будет не год ставить а в запросах говорить чтоб обрабатывал только те данные которые не в архихе например

SQL
WHERE `ahiv`='0'


Но переделывать запросы полюбому придеться...

Но в варианте sergeiss придеться переделывать только апросы связаные с просмотром архива, а в моём же вообще все запросы скорее всего.



Спустя 1 минута, 17 секунд (5.06.2009 - 15:47) FatCat написал(а):
Вариант как на форуме Экслера не пойдет?
В поддиректории стоит копия движка и старая база с архивом. В рабочей директории рабочий движок с рабочей базой.

Я у себя пошел по пути раздельного хранения данных. Самое нагрузочное место базы - тексты сообщений в таблице сообщений. Сделал, чтобы большие сообщения хранились во внешнем файле, а в базе при этом пишется пустая ячейка. Когда пхп-сценарий видит пустую ячейку, он по айдишнику высчитывает имя файла и file_get_contents($file)... В результате имеем на этом форуме при более 100 000 сообщений (строк в таблице) размер таблицы сейчас всего 52.7 MB.

Спустя 3 минуты, 9 секунд (5.06.2009 - 15:50) Yulk написал(а):
glock18
спасибо за совет smile.gif
а что значит "копипастить" ? smile.gif

Спустя 5 минут, 21 секунда (5.06.2009 - 15:55) Yulk написал(а):
Joker
ага, понятна идея... спасибо smile.gif

FatCat
тоже вариант "для лентяев" - сделать копию движка, тоже об этом думала, показалось - совсем непрофессионально smile.gif оказывается так тоже делают...
С раздельным хранением данных как-то сложно, я все-таки еще не специалист...Это моя первая программа... Но спасибо, может когда-нибудь и до такого дойду smile.gif

Спустя 6 минут, 12 секунд (5.06.2009 - 16:01) glock18 написал(а):
Yulk
Пожалуйста smile.gif
"Копипастить" - выполнять n-ое количество раз операции copy (Ctrl-C) и paste (Ctrl-V) с кодом. Обычно делают, если что-то похожее уже реализовано, и нужно сделать это еще раз. Только с двумя другими букИвками.


Цитата
Но в варианте sergeiss придеться переделывать только апросы связаные с просмотром архива, а в моём же вообще все запросы скорее всего.


Не знаю как вы, а я стараюсь всегда локализовать использование любых функций. В том числе, обращения к базе данных. Обычно если так делать, то здесь рефакторинг (добавление поля в необходимые запросы) будет состоять в изменении кода в 1-2 строках.

У меня привита непереносимость одинаковых кусков кода длиной от 3 строк biggrin.gif Но я не жалуюсь - благодаря этому только я всегда стараюсь сделать полное разделение в коде между компонентами.

Спустя 19 минут, 21 секунда (5.06.2009 - 16:21) sergeiss написал(а):
Я тут перечитал, что написал насчет скорости работы и решил уточнить (дабы быть правильно понятым): какой объем БД? Это весьма существенно. Потому что если БД небольшая, то и замедление будет малозаметным.
Это когда БД измеряется десятками гигабайт, то ее уменьшение на десяток-другой гигов заметно улучшает скорости smile.gif При этом некоторые таблицы, наиболее большие, имеют объем в несколько гигов. Увеличение скорости (уменьшение времени обработки) видно, что называется, "невооруженным глазом".
Уточняю: я это по своему опыту говорю, а не из теории. Не далее как вчера чистил БД. Уменьшил ее на 15 гигов, осталось "всего" 28. Скорости выполнения запросов, связанных с наиболее большими таблицами, возросли заметно.

Спустя 1 минута, 42 секунды (5.06.2009 - 16:22) FatCat написал(а):
Цитата (Yulk @ 5.06.2009 - 16:55)
С раздельным хранением данных как-то сложно

Не сложно. Сейчас покажу.

Текст сообщений хранится в таблице ibf_posts в текстовом поле post.
Везде, где есть селекты из таблицы ibf_posts, с последующим использованием $row['post'] добавляется вызов функции:
PHP
if( strlen($row['post'])<3)$row['post'] = $std->extract_archived_post($row['pid'], "arc");

"arc" при вызове функции - это расширение файла.
Позволяет хранить в этих же директориях данные других таблиц с другими расширениями.

Сама функция довольно проста:
PHP
function extract_archived_post($pid$j_type)
    {
        
// Айдишник формирует имя файла. Что больше тысячи - имя директории, что меньше - идет в имя файла:
        
$arc_path = ($pid-$pid%1000)/1000// "отрезали" 3 последние цифры - получили имя директории.
        
$arc_path "../arc/".$arc_path."/"// Положили в директорию на уровень выше, чтобы по http не могли залезть
        
$arc_file $pid%1000/// 3 последние цифры взяли в имя файла
        
$arc_file ROOT_PATH.$arc_path.$arc_file.".".$j_type// собрали полный серверный путь и добавили расширение
        
if(is_writeable$arc_file ))$archived_post file_get_contents$arc_file ); // прочитали файл
        
else $archived_post "";
        
        return 
$archived_post;
    }



Теперь обратное действие: запись в файлы сообщений, чья длина больше 4000 символов:
Везде, где есть запись в ibf_posts (инсерты или апдейты), предварительно добавляется конструкция:
if(strlen($post)>4000)
PHP
{
    
$std->create_archived_post($id"arc"$post);
    
$post " ";
}


И сама функция:
PHP
function create_archived_post($pid$j_type$txt)
    {
        
$arc_path = ($pid-$pid%1000)/1000;
        
$arc_path "../arc/".$arc_path."/";
        
$arc_file $pid%1000;
        
$arc_file $arc_path.$arc_file.".".$j_type;
        
// Первые 4 строки идентичны: высчитываем полный путь и имя файла по айдишнику.
        
        // Функция может использоваться и при удалении файлов: при вызове третий параметр пустой удаляет файл.
        
if(file_exists($arc_file))unlink($arc_file);
        if(
$txt != ""// если третий параметр не пустой (передан текст на сохранение в файле)
        
{
            if(!
file_exists($arc_path))mkdir($arc_path0777); // создаем поддиректорию если нужно
            
$fh fopen($arc_file"w"); // Пишем в файл
            
fwrite($fh$txt);
            
fclose($fh);
        }
    }
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.