PDA

Просмотр полной версии : Хранение изображений в БД


Doom123
01.10.2009, 14:36
Вот не могу никак решить где лучше хранить фотографии .. в БД или в файлах ..

краткое описание ... Сайт с анкетами на куждую анкету по 8 фоток ... примерная посещяемость 5к в день ..


как вы считаете где их лучше хранить?

ChieFSS
01.10.2009, 14:42
Файлами и только файлами. В БД достаточно хранить пути к файлам.
Работа с БД занимает 80% процессорной мощности от выделенной под сайт.
Как минимум лишняя нагрузка на сервер.

Doom123
01.10.2009, 14:56
ну смотри на скоко я знаю запрос вида

SELECT `last_update` FROM `time` WHERE name = "update"

работает не намного медленее

file_get_contents('last_update.txt');

GreenBear
01.10.2009, 15:03
ну вообще то медленее, тк file_get_contents в случае с файлами вообще не нужен.

Doom123
01.10.2009, 15:09
<?php


mysql_connect('localhost','root','') or die('a');
mysql_select_db('a') or die('a');

$i = 0;

$time = microtime(1);

while($i < 20)
{
$res = mysql_query('SELECT a FROM a') or die('a');
$a[] = mysql_fetch_array($res);
$i++;
}

$time = microtime(1) - $time;
echo $time.'<br><BR><BR><BR>';

$i = 0;

$time = microtime(1);

while($i < 20)
{
$re[] = file_get_contents('a.txt');
$i++;
}

$time = microtime(1) - $time;
echo $time.'<br><BR><BR><BR>';
?>


a.txt



1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1w qe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe 1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1w qe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe 1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1w qe1wqe1wqe



mysql


--
-- Структура таблицы `a`
--

CREATE TABLE IF NOT EXISTS `a` (
`a` varchar(261) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Дамп данных таблицы `a`
--

INSERT INTO `a` (`a`) VALUES
('1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe 1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1w qe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe 1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1w qe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe 1wqe1wqe1wqe');



Результат

0.00867295265198



0.0285441875458

хм =\

GreenBear ты прав просто хотел человеку показать что БД это не такой пожиратель ресурсов ка кнам его описывают .. файловая систему тоже грешит этим

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

ChieFSS
01.10.2009, 15:14
Я бы посоветовал из базы брать адрес (или только название) к картинке и подставлять в <img src="">, а сами картинки хранить в отдельной папке.
Плюс не надо будет реализовывать кэширование.

Сайт с анкетами на куждую анкету по 8 фоток ... примерная посещяемость 5к в день
Вот если посчетать сколько всего будет записей в БД, тогда можно будет сделать более точные расчёты.

PS вот это вообще не понятно зачем надо: $re[] = file_get_contents('a.txt');

Doom123
01.10.2009, 15:21
ChieFSS это было для вывода ..
а если замена и удаление? например мне надо чтоб фота название фоты было такое
id_(номер с 1 до 8) получается типо 45654_5.jpg например ..

а еси чел удаляет скажем фоту 45654_4.jpg и добовляет ещё фоту .. мне ж нужно её вставить на место 45654_4.jpg а теперь иди и считай какой по счёту фоты не хватает чтоб вставить место неё .. в этом случае в БД будет быстрее

REBUUS
01.10.2009, 15:23
В ФАЙЛАХ!!!!!!!!!!!!!!!!!!!!!!!!!!!

KaMiKadZe
01.10.2009, 15:25
Чем больше база тем медленнее она работает, да и в БД никто не хранит файлы, я как минимум SQL inj смогу сделать просто загрузив файл

Doom123
01.10.2009, 15:25
REBUUS ммм не думаю то это так очевидно как вы это пишете =)

например в булке есть возможность хранения изображений в БД и если не ошибуюсь эта возможность стоит по умолчанию и + для безопасности .. т.к нету папок с правами записи


и о какой скуле идёт речь? когда внутрености файла экранируется а имя изменяется
думаете в булке(vbulletin) маленькие БД ?

ChieFSS
01.10.2009, 15:26
ChieFSS это было для вывода ..
а если замена и удаление? например мне надо чтоб фота название фоты было такое
id_(номер с 1 до 8) получается типо 45654_5.jpg например ..

а еси чел удаляет скажем фоту 45654_4.jpg и добовляет ещё фоту .. мне ж нужно её вставить на место 45654_4.jpg а теперь иди и считай какой по счёту фоты не хватает чтоб вставить место неё .. в этом случае в БД будет быстрее
А какая разница какое название у фотки будет? Вам же не надо руками в папку лазить.
Допустим такая структура: id, filename.
В поле filename пишите через запятую (двоеточие, кавычки) названия фоток и всё. И пускай они называются хоть 000001, хоть 987654.

Вариантов можно миллион придумать.

REBUUS
01.10.2009, 15:28
а зачем тебе искать ? дальше иди, сделай хоть 45654_245.jpg

KaMiKadZe
01.10.2009, 15:28
REBUUS ммм не думаю то это так очевидно как вы это пишете =)

например в булке есть возможность хранения изображений в БД и если не ошибуюсь эта возможность стоит по умолчанию и + для безопасности .. т.к нету папок с правами записи


и о какой скуле идёт речь? когда внутрености файла экранируется а имя изменяется
Смотри раз экранировали ЗНАЧИТ надо обратно все это дело перевести в норму, чтобы пользователь видел картинку, а тут регулярка и она будет тормазить скрипт...

Gray_Wolf
01.10.2009, 15:29
ChieFSS это было для вывода ..
а если замена и удаление? например мне надо чтоб фота название фоты было такое
id_(номер с 1 до 8) получается типо 45654_5.jpg например ..

а еси чел удаляет скажем фоту 45654_4.jpg и добовляет ещё фоту .. мне ж нужно её вставить на место 45654_4.jpg а теперь иди и считай какой по счёту фоты не хватает чтоб вставить место неё .. в этом случае в БД будет быстрее

А что происходит чаще, замены фоток или просмотр?

Doom123
01.10.2009, 15:30
ChieFSSэто вредит безопасности ... там уязвимость с нулл байтом есть (была) хз какая там версия пхп в любом случае оставлять загружаемое название файла глупо ИМХО

Doom123
01.10.2009, 15:31
KaMiKadZe Оо ... ты походу не понимаешь что такое экранирование .. это не фильрация ..

Gray_Wolf просмотр =)

REBUUS такое вот условие .. не могу ничё с ээтим сделать

ChieFSS
01.10.2009, 15:34
ChieFSSэто вредит безопасности ... там уязвимость с нулл байтом есть (была) хз какая там версия пхп в любом случае оставлять загружаемое название файла глупо ИМХО
Так никто не говорит чтобы ты оставлял называния. Бери timestamp и обзывай им картинку.

KaMiKadZe
01.10.2009, 15:38
KaMiKadZe Оо ... ты походу не понимаешь что такое экранирование .. это не фильрация ..


\'
\"
Экранирование ' и "
Похоже это что ты не понимаешь =)

Doom123
01.10.2009, 15:39
KaMiKadZe верно .. но при экранировании в БД пишется всё в не \' а '

так что возвращять ничё не надо .. и причём тут регулярка ?

п.с кстате это не только ' " а всех спец символов =)

KaMiKadZe
01.10.2009, 15:41
KaMiKadZe верно .. но при экранировании в БД пишется всё в не \' а '

так что возвращять ничё не надо .. и причём тут регулярка ?
хм...у меня такого не было, mysql_escape_string заносило в базу \', а при выводе приходилось через регулярку заменять \' на '
Тогда уж извини, но хранить не стоит в базе такие вещи, если знаешь что такое java сервак lineage 2 на базе mysql, то поймешь :D

Gray_Wolf
01.10.2009, 15:43
KaMiKadZe
Gray_Wolf просмотр =)

Ну тогда нужно оптимизировать просмотр, а то что делают редко может и погрузится чуток...

ChieFSS
01.10.2009, 15:44
хм...у меня такого не было, mysql_escape_string заносило в базу \', а при выводе приходилось через регулярку заменять \' на '
Тогда уж извини, но хранить не стоит в базе такие вещи, если знаешь что такое java сервак lineage 2 на базе mysql, то поймешь :D
Возможно включены magic_quotes. В этом случае mysql_escape_string делает двойную работу.
Java серваки ла2 - это имхо пример как не надо делать не только в плане базы данных.

REBUUS
01.10.2009, 15:44
я бы сделал так, файли я хранил в папке, в БД имена файлов id(пользователя)_дата добавления(что бы не считать какой есть а какой нету и одинаковых)

таблица выглядит так

id | user_id | pic_name

картинки вывожу по user_id
удаляю по id c БД и по pic_name в паке
с заменой нет проблем



если надо ограничит, что бы для юзера не было больше 8 фоток, то просто считаешь cout(id) where user_id="..."<8

REBUUS
01.10.2009, 15:50
если хочешь делать два размера фоток(иногда бывает нужно), больший и маленькие, то просто делаешь другую папку и туда сохраняешь маленькие, а имена те же )))

Doom123
01.10.2009, 15:52
спасибо всем .. буду делать БД + файл )