Необходимо ли хранить пути к изображениям в базе данных? - PullRequest
3 голосов
/ 12 июля 2009

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

В конце концов я пришел к этому .

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

Мой вопрос: пользователь загружает изображение. Я храню путь в базе данных и файл изображения в файловой системе. Однако я делаю 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

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

Ответы [ 6 ]

7 голосов
/ 12 июля 2009

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

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

2 голосов
/ 12 июля 2009

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

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

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

IMAGES_PATH = "/ path / to / images"

И назовите изображения по imageID (автоинкремент), поэтому для 5-го изображения это будет 5.ori.jpg или 5.large.jpg и т. Д.

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

1 голос
/ 12 июля 2009

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

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

Предположим, что ваша структура похожа на

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

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

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

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

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

PATH_ORIGINAL = / home / user / site / images / original /

PATH_SMALL = / home / user / site / images / small /

PATH_MEDIUM = / home / user / site / images / medium /

PATH_LARGE = / home / user / site / images / large /

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

smallcar = PATH_TO_SMALL. car.jpg;

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

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

1 голос
/ 12 июля 2009

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

1 голос
/ 12 июля 2009

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

0 голосов
/ 12 июля 2009

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

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