Что выбрать

Kill_Santa

Новичок
Что выбрать

Предыстория.............................
Есть список из ~500000 элементов. В течении некоторого ближайшего времени это количество увеличится в 10-15 раз. Хостинг - виртуальный. Ежедневно 1000-3000 уникальных пользователей заходят на сайт и просматривают по 3-5 страниц, каждая из которых содержит от 2 до 20 элементов.
__________________________________________
Поставлена задача - добавить к элементу загружаемые иллюстрации. Количество иллюстраций д.б. неограничено. Подписи к иллюстрациям отсутствуют. Текущая реализация - php+mysql
__________________________________________
Вопрос, как лучше поступить:
1. Создать отдельную таблицу с именами загруженных иллюстраций и внешними ключами на элементы?
2. Добавить в таблицу с элементами поле images и путем serialize/unserialize записывать туда перечень всех иллюстраций?
__________________________________________
Аспекты оценки для выбора:
1. Устойчивость алгоритма
2. Скорость работы
3. Экономия места и ресурсов
Заранее всех благодарю за советы и высказанные мнения ПО ТЕМЕ.

-~{}~ 28.02.08 22:47:

А может что-нить интереснее посоветуете? :)
 

A1x

Новичок
имхо в данном случае нет никаких причин заводить отдельную таблицу - делайте сериализед
 

Black Raven

Новичок
А почему нет варианта "создать директорию на основе id элемента и в нее класть иллюстрации для этого элемента"?
 

A1x

Новичок
Black Raven
как узнать в этом случае какого типа картинка?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
[m]Fileinfo[/m]

-~{}~ 28.02.08 23:00:

Понятное дело, если планируется серъезная нагрузка лучше ложить mime данные в бД
 

Alkinoy

Начинающий
Re: Что выбрать

Автор оригинала: Kill_Santa
Вопрос, как лучше поступить:
1. Создать отдельную таблицу с именами загруженных иллюстраций и внешними ключами на элементы?
2. Добавить в таблицу с элементами поле images и путем serialize/unserialize записывать туда перечень всех иллюстраций?
по п.2. То есть при любом добавлении ты должен будешь:
1. считать все поле.
2. распарсить содержимое (десериализить)
3. добавть.
4. сериализить весь объем.
5. записать весь объем...

теперь имеет место быть случай, когда добавлено 200 изображений. нет, 400. ну или например 5000. тебе придется КАЖДЫЙ РАЗ обрабатывать все ВОЗРАСТАЮЩИЙ объем. причем чем дальше, тем больший процент обрабатываемой инфы будет гоняться вхолостую.....

Дальше. три васи пупкина и восемь ирочек решили одновременно добавить картинку к элементу, в котором уже 300 штук добавлено. Так как объем и так уже большой - будем друг друга ждать... а сколько ждать бум? а долго....
дальше. пусть картиночка весит в среднем 100 кил. то есть 10 картинок - метр. а если их 100? а такие объему - уже определенно будет табличка браться не из кэша, а читаться с диска... ню-ню, вперед и вверх.... сколько вы сказали - 3 тыс пользователей в день? ну пусть будет по 1 мБ каждая запись... то есть просто на добавление 300 мБ данных (каждый пользователь по картиночке в 100 кил) через диски прогонится 3 ГИГА на чтание и запись......
 

A1x

Новичок
вы предлагаете узнать расширение файла по типу из getimagesize которой нужно имя файла чтобы определить этот тип? :)

-~{}~ 29.02.08 12:58:

Автор оригинала: Bitterman
A1x

А вариант преобразовывать все в jpg не катит?
катит если это подойдет автору топика
 

Kill_Santa

Новичок
Re: Re: Что выбрать

Автор оригинала: Alkinoy
по п.2. То есть при любом добавлении ты должен будешь:
1. считать все поле.
2. распарсить содержимое (десериализить)
3. добавть.
4. сериализить весь объем.
5. записать весь объем...

теперь имеет место быть случай, когда добавлено 200 изображений. нет, 400. ну или например 5000. тебе придется КАЖДЫЙ РАЗ обрабатывать все ВОЗРАСТАЮЩИЙ объем. причем чем дальше, тем больший процент обрабатываемой инфы будет гоняться вхолостую.....

Дальше. три васи пупкина и восемь ирочек решили одновременно добавить картинку к элементу, в котором уже 300 штук добавлено. Так как объем и так уже большой - будем друг друга ждать... а сколько ждать бум? а долго....
дальше. пусть картиночка весит в среднем 100 кил. то есть 10 картинок - метр. а если их 100? а такие объему - уже определенно будет табличка браться не из кэша, а читаться с диска... ню-ню, вперед и вверх.... сколько вы сказали - 3 тыс пользователей в день? ну пусть будет по 1 мБ каждая запись... то есть просто на добавление 300 мБ данных (каждый пользователь по картиночке в 100 кил) через диски прогонится 3 ГИГА на чтание и запись......
У каждого элемента 3-10 иллюстраций. Реально не знаю, какой способ хранения выбрать....... Третий день голова болит.....

-~{}~ 29.02.08 16:24:

Автор оригинала: A1x
вы предлагаете узнать расширение файла по типу из getimagesize которой нужно имя файла чтобы определить этот тип? :)

-~{}~ 29.02.08 12:58:


катит если это подойдет автору топика
С этим проблем нет. Если кому интересно, рассказываю, сделал так:
$ext = get_ext($_FILES['image']['type']);
if ($ext) {
$new_name = $_SESSION['user']['login']."-".date('Y_F_d-H_i_s')."-".md5(rand()).".".$ext;
copy($_FILES['image']['tmp_name'], "pictures/".$new_name);.........................................................................
..............................................
.............................................
...........................................
function get_ext($type) {
switch ($type) { // запрещаю все форматы, кроме указанных, чтобы bmp и всякой херней хостинг не грузили
case "image/gif": return "gif"; break;
case "image/jpg": return "jpg"; break;
case "image/jpeg": return "jpg"; break;
case "image/png": return "png"; break;
default: return FALSE; break;
}
}
 

A1x

Новичок
хранение в директории на основе id элемента:
плюсы: не нужно хранить дополнительные данные в базе
минусы: при выводе страницы каждый раз надо будет читать директорию с картинками чтобы получить их имена файлов

хранение в сериализед поле:
плюсы: имена файлов для картинок получаются тем же запросом что и сам элемент (не нужно доп. операций)
минусы: надо синхронизировать сериализед поле каждый раз при добавлении/удалении картинки

отдельная таблица:
плюсы: ???
минусы: нужен дополнительный запрос к базе (или джойн) для получения имен картинок.

-~{}~ 29.02.08 16:39:

Alkinoy
вроде бы никто не собирался хранить сами изображения в базе - только имена файлов картинок
 

Alkinoy

Начинающий
Автор оригинала: A1x
хранение в директории на основе id элемента:
...
минусы: при выводе страницы каждый раз надо будет читать директорию с картинками чтобы получить их имена файлов
я что то минуса не понял - что значит читать что бы получить их имена?????????
в базе хранится путь к картинке. все.

Автор оригинала: A1x
вроде бы никто не собирался хранить сами изображения в базе - только имена файлов картинок
да, точно... сорри.
 

Black Raven

Новичок
Автор оригинала: A1x
вы предлагаете узнать расширение файла по типу из getimagesize которой нужно имя файла чтобы определить этот тип? :)
это нужно только один раз - при сохранении.
вообще странный вопрос. зачем вам тип файла?
 

clevel

Новичок
Я бы сделал для каждого элемента - директорию по ID ключу, где хранил бы все файлы.
Но! Список файлов с их аттрибутами хранил бы не в базе, а в файлике, скажем, info.php в данной директории.

Его формат такой:
<?
$images = array('1.jpg',800,600,0
'2.gif',1000,1200,1);
?>

Для его получения делается просто Include, что намного быстрее сериализации.

Для записи новых элементов:
Include файла
Добавление в массив images новых данных
Сохранение обратно в файл через var_export
 

A1x

Новичок
Автор оригинала: Black Raven
это нужно только один раз - при сохранении.
вообще странный вопрос. зачем вам тип файла?
интересно, как вы собираетесь получать имена картинок разных типов при отображении страницы
при условии что в базе мы никакой доп. информации не храним
 

Black Raven

Новичок
Автор оригинала: A1x
интересно, как вы собираетесь получать имена картинок разных типов при отображении страницы
при условии что в базе мы никакой доп. информации не храним
да при чем тут тип? при сохранении изображения проверили, сделали новые имена, расширение задали в соответствии с определенным.
для вывода - glob(getImgsDirById($content_id).'/*.*')
 

dimagolov

Новичок
Black Raven
ИМХО glob ну никак не подходит для ресурса с большой нагрузкой...
1. отдавать картинки надо не php а сервером
2. перечень картинок должен быть доступен по Id элемента

как по мне, то проще всего хранить coma-separated список имен картинок в отдельном поле записи БД элемента (1.jpg,2.png,3.gif,4.jpg), а директории организовать примерно так:
записей ожидаем до 10 млн (10^7), то есть чтобы было не более 1000 (10^3) элементов в директории надо иметь 3 уровня вложенности, к примеру Id=7867456 => dir="78/67/456"
 
Сверху