Когда файлы хранят в БД???
Модератор: terminus
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
-
- рядовой
- Сообщения: 14
- Зарегистрирован: 2009-03-07 13:58:02
- Откуда: Беларусь, Минск
- Контактная информация:
Когда файлы хранят в БД???
Тема может не совсем и подходить к разделу MySQL, но все же, подскажите пожалуйста есть ли смысл хранить файлы в БД. Размер файлов от 1 до 50 МБ примерное количество свыше миллиона содержат в себе изображения. Сам понимаю что работа БД с полями различной длины будет медленной, но просто слабо представляю как этот массив данных рассовать по ФС. Или все же лучше хранить к ним ссылки, пути...?
Услуги хостинговой компании Host-Food.ru
Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: Когда файлы хранят в БД???
а в каком виде нужно храть? как фотоальбом? то зачем ее туда ставить?
надо тестировать!
можете создать таблицу, вставить миллион картинок, и проетсировать
говорили что апач первый, статику быстрее отдаст, чем вынимать из СУБД...
но появились винчестера скоросные, может оно нормально будет eSata SATA300, т.д.
надо тестировать!
можете создать таблицу, вставить миллион картинок, и проетсировать
говорили что апач первый, статику быстрее отдаст, чем вынимать из СУБД...
но появились винчестера скоросные, может оно нормально будет eSata SATA300, т.д.
- Fastman
- ст. лейтенант
- Сообщения: 1236
- Зарегистрирован: 2006-07-07 10:20:38
- Откуда: Минск. РБ
Re: Когда файлы хранят в БД???
И тот и другой путь содержит как минусы - так и плюсы.firefly писал(а):Тема может не совсем и подходить к разделу MySQL, но все же, подскажите пожалуйста есть ли смысл хранить файлы в БД. Размер файлов от 1 до 50 МБ примерное количество свыше миллиона содержат в себе изображения. Сам понимаю что работа БД с полями различной длины будет медленной, но просто слабо представляю как этот массив данных рассовать по ФС. Или все же лучше хранить к ним ссылки, пути...?
Куча копий сломано на форумах по этой теме, Но главные вопросы можно отметить.
За хранение в базе:
- Централизация
- Бэкап вместе с файлами
- При правильном пострении - гарантия соответствия записи и файлу, отсутствие надобности во внешних сервисах которые будут поддерживать консистенцию в паре запись ссылки на файл/сам файл в хранилище.
Против:
- При большом количестве файлов и их размеров - бэкап таки доставит проблем

- Нагрузка на базу дополнительная
- не во всех базах blob до конца готов к промышленному применению.
У нас например софт для архивирование и управлением медиа(звук,аудио,изображения). В базе хранятся только preview кадры к медиаматериалам. Перекрдируется jpeg картинка в base64 и храниться в отдельно таблице. Размер изображения 1-2кб.
Знаю систему где в базе хранятся так же ролики видео.. от 1 до 50мб. Мало того - они прямо из базы стримятся на web страницу.
Вообщем все зависит от конкретного случая, прямых рук разработчика и архитектора.
Главное в жизни здоровье и любовь, остальное я все куплю.
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: Когда файлы хранят в БД???
1) если загружать файл из формы и если будет ошибка при загрузке, то как сделать чтобы удалился файл? не вставлялся в каталог
я нашел вариант хранить файлы распределенно в MySQL, на самом деле файл храниться на диске, но управляется через 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 может как-то перекодировать?
(может не перекодировать, пуская сами кодируют?)
хочу попробовать в будущем...
схему которую я описал, правильно ли выглядит?
я нашел вариант хранить файлы распределенно в 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 может как-то перекодировать?
(может не перекодировать, пуская сами кодируют?)
хочу попробовать в будущем...
схему которую я описал, правильно ли выглядит?
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: Когда файлы хранят в БД???
что с этим делать?
дайте документацию на ENGINE = FILES;, я что-то найти нифига не могу...
может надо MySQL пересобрать какой-то?
Код: Выделить всё
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 пересобрать какой-то?
- Fastman
- ст. лейтенант
- Сообщения: 1236
- Зарегистрирован: 2006-07-07 10:20:38
- Откуда: Минск. РБ
Re: Когда файлы хранят в БД???
Код: Выделить всё
...
может надо MySQL пересобрать какой-то?
Код: Выделить всё
select engine, support from information_schema.engines order by 1;
Последний раз редактировалось Fastman 2009-10-03 15:04:35, всего редактировалось 1 раз.
Главное в жизни здоровье и любовь, остальное я все куплю.
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: Когда файлы хранят в БД???
Код: Выделить всё
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
- Fastman
- ст. лейтенант
- Сообщения: 1236
- Зарегистрирован: 2006-07-07 10:20:38
- Откуда: Минск. РБ
Re: Когда файлы хранят в БД???
Код: Выделить всё
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
Главное в жизни здоровье и любовь, остальное я все куплю.
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: Когда файлы хранят в БД???
вот статьи такие есть http://www.compdoc.ru/bd/mysql/keeping-files-in-mysql/
т.е. я хотел видео файл отдать чтобы его можно было смотреть через браузер в JavaScript (флеш плеер) там нужна статиска?
или можно через php отдать?
(я вот скрипт писал, хотел контролировать качание, просто, т.е. проще через php отдать)
а кто видео хранил и показывал через http? (я так понимаю через JavaScript (флеш плеер) нужно?)
в mime тип - это наверное не правильно?
в общем ладно сделаю как-то...
т.е. я хотел видео файл отдать чтобы его можно было смотреть через браузер в JavaScript (флеш плеер) там нужна статиска?
или можно через php отдать?
(я вот скрипт писал, хотел контролировать качание, просто, т.е. проще через php отдать)
а кто видео хранил и показывал через http? (я так понимаю через JavaScript (флеш плеер) нужно?)
в mime тип - это наверное не правильно?
в общем ладно сделаю как-то...
- Fastman
- ст. лейтенант
- Сообщения: 1236
- Зарегистрирован: 2006-07-07 10:20:38
- Откуда: Минск. РБ
Re: Когда файлы хранят в БД???
Читать до конца не осилил... понятно...вот статьи такие есть http://www.compdoc.ru/bd/mysql/keeping-files-in-mysql/
Проблема за малым — не удалось найти готовой реализации такого движка хранения данных для MySQL, хотя идея общем то простая. Возможно кто-то из хабролюдей подскажет ссылку на готовую реализацию такого storage engine, идея ведь плавает на поверхности, и ее точно кто-то уже мог реализовать.
В связи с отсутствием мысли, знаков препинания и понятия зеленого о теме разговора с твоей стороны, отвечать не буду...т.е. я хотел видео файл отдать чтобы его можно было смотреть через браузер в JavaScript (флеш плеер) там нужна статиска?
или можно через php отдать?
(я вот скрипт писал, хотел контролировать качание, просто, т.е. проще через php отдать)
а кто видео хранил и показывал через http? (я так понимаю через JavaScript (флеш плеер) нужно?)
в mime тип - это наверное не правильно?
в общем ладно сделаю как-то...
Соберись мыслями, поставь четкие задачи, и только тогда спрашивай.
Главное в жизни здоровье и любовь, остальное я все куплю.
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: Когда файлы хранят в БД???
кто как видео хранил и показывал через http?
- Fastman
- ст. лейтенант
- Сообщения: 1236
- Зарегистрирован: 2006-07-07 10:20:38
- Откуда: Минск. РБ
Re: Когда файлы хранят в БД???
Мы храним на отдельном NAS-е. Для того чтобы показать юзеру на Flash-е написан браузерный клиент.ProFTP писал(а):кто как видео хранил и показывал через http?
Главное в жизни здоровье и любовь, остальное я все куплю.
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: Когда файлы хранят в БД???
я вот думаю как это сделать лучше, на youtube через JS в котром флеш плэер
еще хотел сделать чтобы можно было контролировать качание, защиту от доса, ботов, флуда, не знаю как это сделать
а кто знает через php можно отдать видео файл, чтобы можно было его смотреть через браузер в JS?
еще хотел сделать чтобы можно было контролировать качание, защиту от доса, ботов, флуда, не знаю как это сделать
а кто знает через php можно отдать видео файл, чтобы можно было его смотреть через браузер в JS?
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: Когда файлы хранят в БД???
вот я нашел http://dev.mysql.com/doc/refman/5.1/en/files-table.html
только не могу понять как это сделать...
там нужно создать дополнительные таблицы через root в MySQL? пока не могу найти как это сделать все...
ЗЫ я так понял что у меня версия старая, может еще нельзя хранить в этой, только в 5.1?
только не могу понять как это сделать...
там нужно создать дополнительные таблицы через root в MySQL? пока не могу найти как это сделать все...
Код: Выделить всё
$ mysql --version
mysql Ver 14.12 Distrib 5.0.83, for portbld-freebsd8.0 (i386) using 5.2
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: Когда файлы хранят в БД???
короче, опять вопрос автора топика, будет ли оно храниться в базе?
а кто-то смотрели исходники MySQL, на чем вы остановились, т.е. большие файлы можно(целесобразно) хранить прямо в MySQL 10М-300М? или нельзя?
а кто-то смотрели исходники MySQL, на чем вы остановились, т.е. большие файлы можно(целесобразно) хранить прямо в MySQL 10М-300М? или нельзя?
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: Когда файлы хранят в БД???
а что за GUI, это типо GTK+?Fastman писал(а):Мы храним на отдельном NAS-е. Для того чтобы показать юзеру на Flash-е написан браузерный клиент.ProFTP писал(а):кто как видео хранил и показывал через http?
- Fastman
- ст. лейтенант
- Сообщения: 1236
- Зарегистрирован: 2006-07-07 10:20:38
- Откуда: Минск. РБ
Re: Когда файлы хранят в БД???
Ты чего... совсем что ле ???ProFTP писал(а):а что за GUI, это типо GTK+?Fastman писал(а):Мы храним на отдельном NAS-е. Для того чтобы показать юзеру на Flash-е написан браузерный клиент.ProFTP писал(а):кто как видео хранил и показывал через http?

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

Главное в жизни здоровье и любовь, остальное я все куплю.
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: Когда файлы хранят в БД???
а точно, не увидел
- ADRE
- майор
- Сообщения: 2641
- Зарегистрирован: 2007-07-26 8:53:49
- Контактная информация:
Re: Когда файлы хранят в БД???
в мануале mysql было написано, как хранить картинки , файло =/ не проще ли там поискать, сам одно время интересовался...
//del
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: Когда файлы хранят в БД???
я смотрел, перед тем как делать надо над архитектурой по размышлять... вот как раз хотел спросить кто как делал...
в общем я пока остановился, чтобы хранить в файлах...
в общем я пока остановился, чтобы хранить в файлах...
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: Когда файлы хранят в БД???
ради интереса, если файл будет допустим 50-100М, проигрывателеь флеш чере JSFastman писал(а): Знаю систему где в базе хранятся так же ролики видео.. от 1 до 50мб. Мало того - они прямо из базы стримятся на web страницу.
то как мне этот файлы читать побайтово из 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);
- Fastman
- ст. лейтенант
- Сообщения: 1236
- Зарегистрирован: 2006-07-07 10:20:38
- Откуда: Минск. РБ
Re: Когда файлы хранят в БД???
там MSSQL, мало того что в MSSQL/Oracle последних версий уже есть втроенные типы STREAM.ProFTP писал(а):ради интереса, если файл будет допустим 50-100М, проигрывателеь флеш чере JSFastman писал(а): Знаю систему где в базе хранятся так же ролики видео.. от 1 до 50мб. Мало того - они прямо из базы стримятся на web страницу.
...
К сожалению в этом плане MySQL-ю еще как раком до Москвы

Главное в жизни здоровье и любовь, остальное я все куплю.
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: Когда файлы хранят в БД???
в Oracle прикольно http://search.cpan.org/~pythian/DBD-Ora ... e_database
может в MySQL 6.0 будет
===
в PgSQL есть какой-то seek
(я хотел попробовать в MySQL посмотреть как будет, если бы можно было, если вдруг базу будет грузит, то тогда на ФС переместить не проблема)
===
вот на java есть такая штука по-моему http://dev.mysql.com/doc/refman/5.0/en/ ... notes.html
покускам может вытащить из blob
===
есть как дополнение:
http://blobstreaming.org/
может в MySQL 6.0 будет
===
в PgSQL есть какой-то seek
но лучше пока на FSlo_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.
(я хотел попробовать в MySQL посмотреть как будет, если бы можно было, если вдруг базу будет грузит, то тогда на ФС переместить не проблема)
===
вот на java есть такая штука по-моему http://dev.mysql.com/doc/refman/5.0/en/ ... notes.html
покускам может вытащить из blob
===
есть как дополнение:
http://blobstreaming.org/
Последний раз редактировалось ProFTP 2009-10-09 19:31:33, всего редактировалось 1 раз.
- Pattern
- сержант
- Сообщения: 180
- Зарегистрирован: 2007-08-30 23:45:54
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Когда файлы хранят в БД???
Смысла нет никакого, даже если это мелкие файлы. Это не больше не меньше чем просто "удобно", но не более того.firefly писал(а):подскажите пожалуйста есть ли смысл хранить файлы в БД
Честно скажу, не изобретайте велосипед и не ломайте голову над не нужными проблемами.
Из приведённых выше плюсов и минусов можно подчеркнуть только минус в сторону разработчика, кто испытывает эти "плюс-минусы". А по факту, лучше держать файлы отдельно, БД отдельно. Для скуля - никаких blob-полей и минимум полей типа text, если вы действительно хотите шустрой и не напряжной работы серваку.
Как распределять данные? Да никак! Все нужные файлы хранятся только в одном месте. Не нужно ломать над структурированным хранением файлов. Это вам не локальный компьютер, чтобы видео в одном месте, картинки в другом, софт в третьем. Конечно, не сомненно, можно посидеть пару суток с карандашом в зубах и продумать как будет организовываться сохранение по каталогам. Но потом можно "хапнуть" горя с этой структурой (например, при переносе файла из одно каталога в другой или когда файл может быть расположен в разных каталогах). Посему, лучше когда единое хранилище для всего хлама. Во время сохранения файла ему присваивается имя текущего времени с точностью до 100 секунды (типо 2009101419365199). Расширение можно так же не указывать, всё равно вы его никогда не будете локально на серваке запускать. Реальное же имя указываем в таблице БД. Всё это делается для того, дабы не получить "случайное" (читай, не предусмотренное) сохранение файла с русским именем. Но если совсем не в моготу, чтобы ещё всё наглядно было при визуальном контроле, расширение можно и оставить. Но говорю из практики, вам это никогда не понадобится даже в мегасуперкритических ситуациях.
Всё остальное отдаём на съедение скриптам и скулю. Про скрипты говорить вообще ничего не буду, придумать как вытащить данные или сохранить их - это не составляет особого труда. Структуру БД для хранения и получения этих данных можно ограничить до 3 таблиц:
1 - дерево каталогов (например, структура nestedset)
2 - тип данных (gif, png, avi и.т.п) с расширениями (отдельным полем)
3 - файлы (имя файла физическое, имя файла отображаемое, тип, каталог)
Но обычно, при хорошем раскладе, таблиц получается больше (если грамотно всё организовывать). Таблицы с обязательным индексированием, иначе при перевале записей за 10к будете ощущать тормоза при обработке данных.
То что я описал выше - работает. Причем работает очень шустро даже при огромном потоке запросов (опыт при работе с СМС-центрами) на компе среднего класса (даже не сервере).
Your bunny wrote: its not a bug, this is a feature, actually... 

- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: Когда файлы хранят в БД???
это точная инфомрация? система не будет тратить усилия чтобы открыть этот каталог если там будет большое n-количество файлов?Pattern писал(а):Как распределять данные? Да никак! Все нужные файлы хранятся только в одном месте
насколко я помню это в handbook было написано что при открытии каталога используються специальный кэш, т.к. это ресурсоемко