2009-07-12 3 views
3

Во-первых, я заметил, что есть вопросов по этому вопросу, отмеченные как дубликаты.Сохраняется ли путь к изображениям в базе данных?

В конце концов я пришел к this one.

И принятый ответ на этот вопрос, хотя частично решает мой вопрос, он не отвечает на все это.

У меня вопрос, Пользователь загружает изображение. Я сохраняю путь в базе данных и файл изображения в файловой системе. Тем не менее, я делаю 3 копии этого изображения (большие, средние и малые). Итак, у меня есть 4 изображения - оригинальные, большие, средние, маленькие.

Должен ли я хранить все 4 путь в базе данных, например, так

ID |  original  | large  | medium  | small  | 
----+--------------------+-----------------+-----------------+----------------+ 
1 | /path/to/original | /path/to/large/ | /path/to/medium | /path/to/small | 

или просто хранить путь страниц оригинала, и дать другое 3 именование, например, так: car.jpg, car.jpg, large-car.jpg, medium-car.jpg, small-car.jpg?

Я чувствую, что этот путь будет менее тяжелым для базы данных, и если позже я захочу добавить другой размер (т. Е. Лишний маленький), мне не нужно будет модифицировать базу данных.

ответ

7

Если все изображения в заданной строке живут в одном и том же месте, я бы сказал, что их базовый путь должен быть его собственным столбцом (а не повторным получением базового пути из полного пути исходного изображения все время).

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

+0

Ну, это блог. У каждого пользователя есть свой собственный каталог. каждый раз, когда пользователь делает блог с фотографиями, я создаю новый каталог с блогаID, а внутри этого каталога я планирую хранить все 4 изображения. – sqram

+0

Тогда то, что я хотел бы сделать, это иметь константу для родительского элемента для всех этих каталогов: 'define ('BLOG_IMAGE_BASE_PATH', '/ images/go/here')' или что угодно, и, в идеале, метод для объекта пользователя, function getImagePath() {return BLOG_IMAGE_BASE_PATH. '/'. $ This-> blogID; } 'и собирать пути изображения из этого. – chaos

1

Уверены, что у вас есть твердое соглашение об именах для различных размеров исходного изображения, это поможет вам генерировать известные ключи кеша, чтобы вы могли хранить изображения в каком-то кеше, например memcache, это уменьшает нагрузку на db и серверный диск i/o

2

Похоже, вы пытаетесь чрезмерно использовать базу данных. Как насчет этого метода.

ImageID | UserID | name.. 
---------+---------+----- 
1  | 495  | car454.jpg 
2  | 495  | house.jpg 
3  | 44  | kittysmall.jpg 

И сохраните все изображения в одном месте.

IMAGES_PATH = "/ путь/к/изображений"

и имя изображения, в ImageID (Auto Increment), так и для 5-го изображения, было бы 5.ori.jpg или 5.large.jpg и т. д.

Таким образом, вы можете легко увидеть, кому принадлежит изображение, а также пользователь может загружать разные изображения с тем же именем и не беспокоиться об этом.

+0

Интересно. Но разве этот метод фактически не будет использовать базу данных? Я имею в виду, что для каждого загруженного изображения было бы сделано 4 транзакции вставки. Если пользователь загрузит «car.jpg», я бы изменил его размер на большой, средний и маленький. таким образом я бы ввел car.jpg, small-car.jpg, large-car.jpg и medium-car.jpg в базу данных; в отличие от просто вставки «car.jpg», и, когда вы хотите показать все 4 изображения в блоге, я просто добавлю «small-», «large-», «medium-» к исходному имени изображения (car.jpg) – sqram

+0

Нет лиры, вы все равно будете использовать только одну вставку. Вы должны вставить «car.jpg» и в результате выбрать автоматически увеличивающийся идентификатор, скажем, он вернет «5». Затем вы сохраните «5-small.jpg», «5-medium.jpg» и «5-large.jpg». –

1

Чтобы обобщить, я бы сказал, если вы можете воссоздать информацию (потому что база всегда одна и та же, за которой следует имя пользователя), не храните ее в базе данных. Если позже вы захотите изменить каталог, в котором вы храните изображения по какой-либо причине, у вас возникнут проблемы.

0

В качестве незначительной настройки у меня возникнет соблазн разместить сгенерированные эскизы и т. Д. По другому пути (например: ../generated/), чтобы убедиться, что вы не перезаписываете исходное изображение, если кто-то загружает файл под названием «car-large.jpg» и т. д.

+0

Хорошо, если кто-то загрузит файл под названием «large-car.jpg», «большой» будет добавлен, и он станет «large-large-car.jpg». – sqram

1

Если конкретные пути согласованы, за исключением имен файлов, почему бы не использовать константы для путей, а затем просто сохранить изображения разных размеров в соответствующих каталогах и указать только имена файлов в базе данных.

Основным принципом здесь является избежание дублирования информации, в базе данных и в вашем коде. Для базы данных вы получаете более высокую нормальную форму, а для кода вы достигаете DRY (Do not Repeat Yourself).

Предположим, вы структура что-то вроде

/Главная/пользователь/сайт/изображения/оригинал/

/дом/пользователь/сайт/изображения/маленькие/

/Главная/пользователь/сайт/фото/средний/

/дом/пользователь/сайт/изображения/большое/

вы могли бы использовать константы для этой информации. например

PATH_ORIGINAL =/дом/пользователь/сайт/изображения/оригинал/

PATH_SMALL =/дом/пользователь/сайт/изображения/маленький/

PATH_MEDIUM =/дом/пользователь/сайт/изображения/средний/

PATH_LARGE =/дом/пользователь/сайт/изображения/большой/

Тогда в вашем коде вы могли бы сделать что-то вроде

smallcar = PATH_TO_SMALL. car.jpg;

Или просто вставьте соответствующую постоянную переменную в любой вывод запроса, который у вас есть для загрузки изображений.

Дополнительным преимуществом является то, что у вас есть одно место для изменения путей, если вам нужно настроить структуры каталогов или переместить код между серверами, вместо того, чтобы обновлять всю сводку записей базы данных, что может быть более проблематичным и подверженным ошибкам.

+0

Изображения могут быть перезаписаны таким образом, нет? – sqram

+0

независимо от того, какой скрипт пишет или создает оригиналы (я предполагаю, из процесса загрузки файлов), пусть файлы изображений устанавливают разрешения для чтения только после их написания.Это должно защитить вас от перезаписи. Но тогда вам придется ошибочно обрабатывать любые попытки записи в файл только для чтения. Другой распространенный метод заключается в том, что перед сохранением добавляется уникальная строка хэша в начало имени файла. Таким образом, все новые файлы гарантированно будут уникальными именами. Но, возможно, я не понимаю первоначального намерения вашего вопроса. –

Смежные вопросы