Страница 1 из 3
Когда файлы хранят в БД???
Добавлено: 2009-08-03 12:43:17
firefly
Тема может не совсем и подходить к разделу MySQL, но все же, подскажите пожалуйста есть ли смысл хранить файлы в БД. Размер файлов от 1 до 50 МБ примерное количество свыше миллиона содержат в себе изображения. Сам понимаю что работа БД с полями различной длины будет медленной, но просто слабо представляю как этот массив данных рассовать по ФС. Или все же лучше хранить к ним ссылки, пути...?
Re: Когда файлы хранят в БД???
Добавлено: 2009-08-03 13:11:00
ProFTP
а в каком виде нужно храть? как фотоальбом? то зачем ее туда ставить?
надо тестировать!
можете создать таблицу, вставить миллион картинок, и проетсировать
говорили что апач первый, статику быстрее отдаст, чем вынимать из СУБД...
но появились винчестера скоросные, может оно нормально будет eSata SATA300, т.д.
Re: Когда файлы хранят в БД???
Добавлено: 2009-08-03 17:43:10
Fastman
firefly писал(а):Тема может не совсем и подходить к разделу MySQL, но все же, подскажите пожалуйста есть ли смысл хранить файлы в БД. Размер файлов от 1 до 50 МБ примерное количество свыше миллиона содержат в себе изображения. Сам понимаю что работа БД с полями различной длины будет медленной, но просто слабо представляю как этот массив данных рассовать по ФС. Или все же лучше хранить к ним ссылки, пути...?
И тот и другой путь содержит как минусы - так и плюсы.
Куча копий сломано на форумах по этой теме, Но главные вопросы можно отметить.
За хранение в базе:
- Централизация
- Бэкап вместе с файлами
- При правильном пострении - гарантия соответствия записи и файлу, отсутствие надобности во внешних сервисах которые будут поддерживать консистенцию в паре запись ссылки на файл/сам файл в хранилище.
Против:
- При большом количестве файлов и их размеров - бэкап таки доставит проблем

- Нагрузка на базу дополнительная
- не во всех базах blob до конца готов к промышленному применению.
У нас например софт для архивирование и управлением медиа(звук,аудио,изображения). В базе хранятся только preview кадры к медиаматериалам. Перекрдируется jpeg картинка в base64 и храниться в отдельно таблице. Размер изображения 1-2кб.
Знаю систему где в базе хранятся так же ролики видео.. от 1 до 50мб. Мало того - они прямо из базы стримятся на web страницу.
Вообщем все зависит от конкретного случая, прямых рук разработчика и архитектора.
Re: Когда файлы хранят в БД???
Добавлено: 2009-09-09 13:38:51
ProFTP
1) если загружать файл из формы и если будет ошибка при загрузке, то как сделать чтобы удалился файл? не вставлялся в каталог
я нашел вариант хранить файлы распределенно в MySQL, на самом деле файл храниться на диске, но управляется через MySQL
Код: Выделить всё
CREATE TABLE `data_storage`.`files` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`path` VARCHAR( 255 ) ,
`data` BLOB
) ENGINE = FILES
Вставлять данные в такую таблицу можно только в поле `data`, при этом они просто сохраняются в файл, уникальное имя ему при этом генерируется автоматически (используя в качестве префикса поле `id`) — например 764533, а в поле `path` автоматически подставляется правильный путь, по которому MySQL положил наши данные — например `/mnt/storage/mysqldata/76/45/33/764533_myfile.jpg`. Таким образом к данным, сохраненным в такой таблице можно обращаться как к простым файлам, и при этом MySQL будет поддерживать целостность данных.
для просмотра, вот нашел варианты:
http://www.drupal.ru/node/25077
http://xpoint.ru/forums/programming/per ... 4404.xhtml
2) как перекодировать видео?
на youtube больше чем 10М редко занимет (я качал с него)
например поставлю, максимально загржать из формы 10М
дальше как только загрузилось, перекодировать через скрипт который запускается через какое-то время, как только перекодирует отметить что готово для просмотра
или может на ходу перекодировать
http://search.cpan.org/search?query=ffmpeg&mode=all как-то ?
тогда когда передается файл из форм?
хранить в видео формате FLV (флеш)
может java Script может как-то перекодировать?
(может не перекодировать, пуская сами кодируют?)
хочу попробовать в будущем...
схему которую я описал, правильно ли выглядит?
Re: Когда файлы хранят в БД???
Добавлено: 2009-10-03 14:51:17
ProFTP
что с этим делать?
Код: Выделить всё
mysql> CREATE TABLE `data_storage`.`files` (
-> `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
-> `path` VARCHAR( 255 ) ,
-> `data` BLOB
-> ) ENGINE = FILES;
ERROR 1286 (42000): Unknown table engine 'FILES'
дайте документацию на
ENGINE = FILES;, я что-то найти нифига не могу...
может надо MySQL пересобрать какой-то?
Re: Когда файлы хранят в БД???
Добавлено: 2009-10-03 15:01:09
Fastman
Код: Выделить всё
select engine, support from information_schema.engines order by 1;
И расскажи где ты такой бред нарыл....
Re: Когда файлы хранят в БД???
Добавлено: 2009-10-03 15:04:05
ProFTP
Код: Выделить всё
mysql> select engine, support from information_schema.engines order by 1;
ERROR 1109 (42S02): Unknown table 'engines' in information_schema
а есть ли доки?
а то я найти что-то не могу...
http://www.google.com.ua/#hl=uk&q=+MySQ ... 4c8c5f5ddc
Re: Когда файлы хранят в БД???
Добавлено: 2009-10-03 15:06:49
Fastman
Код: Выделить всё
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 402564
Server version: 5.1.34 FreeBSD port: mysql-server-5.1.34
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select engine, support from information_schema.engines order by 1;
+------------+---------+
| engine | support |
+------------+---------+
| ARCHIVE | YES |
| BLACKHOLE | YES |
| CSV | YES |
| FEDERATED | NO |
| InnoDB | YES |
| MEMORY | YES |
| MRG_MYISAM | YES |
| MyISAM | DEFAULT |
+------------+---------+
8 rows in set (0.00 sec)
mysql>
Перестань курить траву. Нету такого движка.
http://dev.mysql.com/doc/refman/5.1/en/ ... gines.html
Re: Когда файлы хранят в БД???
Добавлено: 2009-10-03 15:28:03
ProFTP
вот статьи такие есть
http://www.compdoc.ru/bd/mysql/keeping-files-in-mysql/
т.е. я хотел видео файл отдать чтобы его можно было смотреть через браузер в JavaScript (флеш плеер) там нужна статиска?
или можно через php отдать?
(я вот скрипт писал, хотел контролировать качание, просто, т.е. проще через php отдать)
а кто видео хранил и показывал через http? (я так понимаю через JavaScript (флеш плеер) нужно?)
в mime тип - это наверное не правильно?
в общем ладно сделаю как-то...
Re: Когда файлы хранят в БД???
Добавлено: 2009-10-03 15:32:18
Fastman
Читать до конца не осилил... понятно...
Проблема за малым — не удалось найти готовой реализации такого движка хранения данных для MySQL, хотя идея общем то простая. Возможно кто-то из хабролюдей подскажет ссылку на готовую реализацию такого storage engine, идея ведь плавает на поверхности, и ее точно кто-то уже мог реализовать.
т.е. я хотел видео файл отдать чтобы его можно было смотреть через браузер в JavaScript (флеш плеер) там нужна статиска?
или можно через php отдать?
(я вот скрипт писал, хотел контролировать качание, просто, т.е. проще через php отдать)
а кто видео хранил и показывал через http? (я так понимаю через JavaScript (флеш плеер) нужно?)
в mime тип - это наверное не правильно?
в общем ладно сделаю как-то...
В связи с отсутствием мысли, знаков препинания и понятия зеленого о теме разговора с твоей стороны, отвечать не буду...
Соберись мыслями, поставь четкие задачи, и только тогда спрашивай.
Re: Когда файлы хранят в БД???
Добавлено: 2009-10-03 15:46:05
ProFTP
кто как видео хранил и показывал через http?
Re: Когда файлы хранят в БД???
Добавлено: 2009-10-03 15:54:47
Fastman
ProFTP писал(а):кто как видео хранил и показывал через http?
Мы храним на отдельном NAS-е. Для того чтобы показать юзеру на Flash-е написан браузерный клиент.
Re: Когда файлы хранят в БД???
Добавлено: 2009-10-04 3:46:13
ProFTP
я вот думаю как это сделать лучше, на youtube через JS в котром флеш плэер
еще хотел сделать чтобы можно было контролировать качание, защиту от доса, ботов, флуда, не знаю как это сделать
а кто знает через php можно отдать видео файл, чтобы можно было его смотреть через браузер в JS?
Re: Когда файлы хранят в БД???
Добавлено: 2009-10-04 4:42:54
ProFTP
вот я нашел
http://dev.mysql.com/doc/refman/5.1/en/files-table.html
только не могу понять как это сделать...
там нужно создать дополнительные таблицы через root в MySQL? пока не могу найти как это сделать все...
Код: Выделить всё
$ mysql --version
mysql Ver 14.12 Distrib 5.0.83, for portbld-freebsd8.0 (i386) using 5.2
ЗЫ я так понял что у меня версия старая, может еще нельзя хранить в этой, только в 5.1?
Re: Когда файлы хранят в БД???
Добавлено: 2009-10-04 8:11:17
ProFTP
короче, опять вопрос автора топика, будет ли оно храниться в базе?
а кто-то смотрели исходники MySQL, на чем вы остановились, т.е. большие файлы можно(целесобразно) хранить прямо в MySQL 10М-300М? или нельзя?
Re: Когда файлы хранят в БД???
Добавлено: 2009-10-04 13:43:16
ProFTP
Fastman писал(а):ProFTP писал(а):кто как видео хранил и показывал через http?
Мы храним на отдельном NAS-е. Для того чтобы показать юзеру на Flash-е написан браузерный клиент.
а что за GUI, это типо GTK+?
Re: Когда файлы хранят в БД???
Добавлено: 2009-10-04 13:50:42
Fastman
ProFTP писал(а):Fastman писал(а):ProFTP писал(а):кто как видео хранил и показывал через http?
Мы храним на отдельном NAS-е. Для того чтобы показать юзеру на Flash-е написан браузерный клиент.
а что за GUI, это типо GTK+?
Ты чего... совсем что ле ???

)))
Погляди внимательно - это браузер

)) Это web клиент к видео - архиву. Написан на Adobe Flash
Re: Когда файлы хранят в БД???
Добавлено: 2009-10-04 13:56:09
ProFTP
а точно, не увидел
Re: Когда файлы хранят в БД???
Добавлено: 2009-10-05 6:52:45
ADRE
в мануале mysql было написано, как хранить картинки , файло =/ не проще ли там поискать, сам одно время интересовался...
Re: Когда файлы хранят в БД???
Добавлено: 2009-10-05 8:40:23
ProFTP
я смотрел, перед тем как делать надо над архитектурой по размышлять... вот как раз хотел спросить кто как делал...
в общем я пока остановился, чтобы хранить в файлах...
Re: Когда файлы хранят в БД???
Добавлено: 2009-10-09 18:16:45
ProFTP
Fastman писал(а):
Знаю систему где в базе хранятся так же ролики видео.. от 1 до 50мб. Мало того - они прямо из базы стримятся на web страницу.
ради интереса, если файл будет допустим 50-100М, проигрывателеь флеш чере JS
то как мне этот файлы читать побайтово из MySQL из blob?
или там движок в MySQL был другой со всем?
функция seek разве есть в MySQL?
из файловой системы вот так, отдача через php:
Код: Выделить всё
$start = (int) @$_GET['position'];
if ($start < 0) die("You fucking idiot");
// open file for reading
$fp = fopen($file, 'r+');
$fsize = filesize($file);
if ($start > 0)
{
// seek to requested position
fseek($fp, $start);
// FLV header for the movie part. Magic. Just trust me.
// Header code is completely taken from flv4php project
$header = "FLV" . pack('C', 1 ) . pack('C', 5 ) . pack('N', 9 ) . pack('N', 9 );
header("Content-Length: " . (strlen($header) + $fsize - $start));
echo $header;
} else {
header("Content-Length: " . $fsize);
}
set_time_limit(0);
while(!feof($fp)) {
print(fread($fp, 1024));
usleep(1000);// limit download speed
}
fclose($fp);
Re: Когда файлы хранят в БД???
Добавлено: 2009-10-09 18:33:23
Fastman
ProFTP писал(а):Fastman писал(а):
Знаю систему где в базе хранятся так же ролики видео.. от 1 до 50мб. Мало того - они прямо из базы стримятся на web страницу.
ради интереса, если файл будет допустим 50-100М, проигрывателеь флеш чере JS
...
там MSSQL, мало того что в MSSQL/Oracle последних версий уже есть втроенные типы STREAM.
К сожалению в этом плане MySQL-ю еще как раком до Москвы

Re: Когда файлы хранят в БД???
Добавлено: 2009-10-09 18:44:52
ProFTP
в Oracle прикольно
http://search.cpan.org/~pythian/DBD-Ora ... e_database
может в MySQL 6.0 будет
===
в PgSQL есть какой-то seek
lo_lseek
$loc = $dbh->pg_lo_lseek($lobj_fd, $offset, $whence);
Changes the current read or write location on the large object $obj_id. Currently $whence can only be 0 (which is L_SET). Returns the current location and undef upon failure. This function cannot be used if AutoCommit is enabled.
но лучше пока на FS
(я хотел попробовать в MySQL посмотреть как будет, если бы можно было, если вдруг базу будет грузит, то тогда на ФС переместить не проблема)
===
вот на java есть такая штука по-моему
http://dev.mysql.com/doc/refman/5.0/en/ ... notes.html
покускам может вытащить из blob
===
есть как дополнение:
http://blobstreaming.org/
Re: Когда файлы хранят в БД???
Добавлено: 2009-10-14 19:07:59
Pattern
firefly писал(а):подскажите пожалуйста есть ли смысл хранить файлы в БД
Смысла нет никакого, даже если это мелкие файлы. Это не больше не меньше чем просто "удобно", но не более того.
Честно скажу, не изобретайте велосипед и не ломайте голову над не нужными проблемами.
Из приведённых выше плюсов и минусов можно подчеркнуть только минус в сторону разработчика, кто испытывает эти "плюс-минусы". А по факту, лучше держать файлы отдельно, БД отдельно. Для скуля - никаких blob-полей и минимум полей типа text, если вы действительно хотите шустрой и не напряжной работы серваку.
Как распределять данные? Да никак! Все нужные файлы хранятся только в одном месте. Не нужно ломать над структурированным хранением файлов. Это вам не локальный компьютер, чтобы видео в одном месте, картинки в другом, софт в третьем. Конечно, не сомненно, можно посидеть пару суток с карандашом в зубах и продумать как будет организовываться сохранение по каталогам. Но потом можно "хапнуть" горя с этой структурой (например, при переносе файла из одно каталога в другой или когда файл может быть расположен в разных каталогах). Посему, лучше когда единое хранилище для всего хлама. Во время сохранения файла ему присваивается имя текущего времени с точностью до 100 секунды (типо 2009101419365199). Расширение можно так же не указывать, всё равно вы его никогда не будете локально на серваке запускать. Реальное же имя указываем в таблице БД. Всё это делается для того, дабы не получить "случайное" (читай, не предусмотренное) сохранение файла с русским именем. Но если совсем не в моготу, чтобы ещё всё наглядно было при визуальном контроле, расширение можно и оставить. Но говорю из практики, вам это никогда не понадобится даже в мегасуперкритических ситуациях.
Всё остальное отдаём на съедение скриптам и скулю. Про скрипты говорить вообще ничего не буду, придумать как вытащить данные или сохранить их - это не составляет особого труда. Структуру БД для хранения и получения этих данных можно ограничить до 3 таблиц:
1 - дерево каталогов (например, структура nestedset)
2 - тип данных (gif, png, avi и.т.п) с расширениями (отдельным полем)
3 - файлы (имя файла физическое, имя файла отображаемое, тип, каталог)
Но обычно, при хорошем раскладе, таблиц получается больше (если грамотно всё организовывать). Таблицы с обязательным индексированием, иначе при перевале записей за 10к будете ощущать тормоза при обработке данных.
То что я описал выше - работает. Причем работает очень шустро даже при огромном потоке запросов (опыт при работе с СМС-центрами) на компе среднего класса (даже не сервере).
Re: Когда файлы хранят в БД???
Добавлено: 2009-10-14 21:16:12
ProFTP
Pattern писал(а):Как распределять данные? Да никак! Все нужные файлы хранятся только в одном месте
это точная инфомрация? система не будет тратить усилия чтобы открыть этот каталог если там будет большое n-количество файлов?
насколко я помню это в handbook было написано что при открытии каталога используються специальный кэш, т.к. это ресурсоемко