Страница 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

Код: Выделить всё

...
может надо MySQL пересобрать какой-то?

Код: Выделить всё

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
вот статьи такие есть http://www.compdoc.ru/bd/mysql/keeping-files-in-mysql/
Читать до конца не осилил... понятно...

Проблема за малым — не удалось найти готовой реализации такого движка хранения данных для 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 было написано что при открытии каталога используються специальный кэш, т.к. это ресурсоемко