PHP для хранения изображений в MySQL или нет?

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

Вы действительно можете использовать агрегированный запрос с DATEDIFF и COALESCE:

SELECT 
    t1.emp_id,
    t1.emp_name,
    SUM(
        COALESCE(
            DATEDIFF(
                COALESCE(t2.end_date, CURDATE()),
                t2.start_date
            ),
        0
    ) as total_days
FROM
    table1 t1
    LEFT JOIN table2 t2 
       ON t1.emp_id = t2.emp_id
GROUP BY 
    t1.emp_id,
    t1.emp_name

В левом соединении избегает фильтрации записей, которые не могут быть сопоставлены в таблице2. DATEDIFF возвращает количество дней между двумя датами. Если любая из дат имеет значение NULL, возвращается NULL. Вы можете получить это с помощью COALESCE и вместо этого вернуть 0.

31
задан palacsint 27 January 2012 в 14:24
поделиться

10 ответов

Всегда зависит контекста, но обычно, я храню пользовательское изображение в файловой системе в папке, названной /content/user/{user_id}.jpg, и пытаюсь побеспокоить базу данных как можно меньше.

40
ответ дан 27 November 2019 в 21:23
поделиться

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

0
ответ дан 27 November 2019 в 21:23
поделиться

Поскольку другие предложили:

  • Хранилище изображения в файловой системе
  • не потрудились хранить имя файла, просто использовать идентификатор пользователя (или что-либо еще, что "Вы уже знаете")
  • Помещенные статические данные по другому серверу (даже если Вы просто используете "static.yourdomain.com" в качестве псевдонима к Вашему нормальному серверу)

, Почему?

, Чем больше Ваша база данных становится, тем медленнее это доберется. Хранение Вашего изображения в базе данных увеличит Ваш размер базы данных. Хранение имени файла увеличит Ваш размер базы данных.

Помещающие статические данные по другому серверу (псевдоним):

  • Делает увеличение масштаба намного легче
  • , Большинство браузеров не отправит больше чем два запроса к тому же серверу путем помещения статических данных по "второму" серверу, Вы ускоряете загрузку
2
ответ дан 27 November 2019 в 21:23
поделиться

Я думаю, что большинство механизмов базы данных уже так совершенствуется, что хранение BLOB данных не производит недостатков (чрезмерно увеличенный в размере дб и т.д.). Одно преимущество состоит в том, что у Вас нет неработающих ссылок, когда изображение уже находится в базе данных. Однако я самостоятельно всегда делал так, чтобы я хранил файл на диске и дал URI базе данных. Это зависит от использования. Может быть легче обработать img в дб, если страница является очень динамичной и часто изменяется - никакое пространство имен - проблемы. Я должен сказать, что это заканчивается вниз, какому Вы предпочитаете.

2
ответ дан 27 November 2019 в 21:23
поделиться

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

, например, если у пользователя есть идентификатор 23, можно сохранить изображение в www.yourname.com/users/profile_images/23.jpg. Затем для отображения можно проверить, существует ли изображение, и отобразитесь, оно соответственно еще отображает универсальный значок.

2
ответ дан 27 November 2019 в 21:23
поделиться

Я недавно видел список этой подсказки: http://www.ajaxline.com/32-tips-to-speed-up-your-mysql-queries

Подсказка 17: Для Вашего веб-приложения изображения и другие двоичные активы должны обычно храниться как файлы. Таким образом, сохраните только ссылку на файл, а не сам файл в базе данных.

Поэтому просто сохраняют путь к файлу к изображению :)

9
ответ дан 27 November 2019 в 21:23
поделиться

Мы создали магазин, который сохранил изображения в DB. Это работало отлично во время разработки, но после того как мы протестировали его на рабочих серверах, время загрузки страницы было слишком высоко, и это добавило ненужную загрузку в серверы БД.

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

Это - одни из тех вечных дебатов с превосходными аргументами с обеих сторон, но за мои деньги я держал бы изображения отдельно от DB.

10
ответ дан 27 November 2019 в 21:23
поделиться

Я рекомендовал бы хранить изображение как файл и затем имел бы файл URI в базе данных. При хранении всех изображений в базе данных у Вас могли бы быть некоторые проблемы с масштабированием позднее.

Выезд этот ответ также:

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

23
ответ дан 27 November 2019 в 21:23
поделиться
  1. Для чего вообще нужен тип данных blob, если не для хранения файлов?
  2. Если ваше приложение требует авторизации до доступа к файлам, изменения состоят в том, что вы а) храните файлы вне DOCUMENT_ROOT (чтобы к ним нельзя было получить прямой доступ, и, возможно, б) отправка всего содержимого файлов через приложение (конечно, может быть, вы делаете что-то вроде временного перехода к хэшированию, но публично - вещь с доступным именем файла). Таким образом, накладные расходы памяти все равно есть, и вы также можете извлекать данные из базы данных.
  3. Если вам нужно хранить файлы в файловой системе, сделайте то, что Андреас предложил выше, и назовите их, используя то, что вы уже знаете (т.е. первичный ключ соответствующей таблицы).
4
ответ дан 27 November 2019 в 21:23
поделиться

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

Это говорит о том, что самый простой/лучший способ, если только у вас нет пары серверов, которые вы можете себе позволить, это хранить их в файловой системе

  • Не хранить абсолютный URL файла в вашей БД, только уникальную часть (и, возможно, папку или две), e. g. 2009/uniqueImageName.jpg или просто uniqueImageName.jpg. Затем на ваших страницах просто добавьте хост и другие папки на фронт, таким образом у вас будет некоторая гибкость в перемещении ваших изображений - все, что вам нужно будет изменить - это строка или две на вашей PHP/ASP.NET странице.

  • Для безопасности нет необходимости хранить за пределами корня документа - . Файл htaccess с DENY FROM ALL будет работать одинаково и обеспечит большую гибкость

  • Нет необходимости 'шунтировать' образы так много для безопасности, просто используйте getImage. php или что-то в этом роде, а затем вместо того, чтобы вставить фактический URL в src изображения , используйте что-то вроде getImage.php?file=uniqueImageName.jpg. Тогда файл getImage.php может проверить, авторизован ли пользователь, и получить изображение (или нет).

  • Используйте имя, которое гарантированно будет уникальным (желательно целое число, т.е. первичный ключ) при хранении, некоторую файловую систему (т.е. Windows) не чувствительны к регистру, поэтому JoeBloggs.jpg и joebloggs.jpg уникальны для базы данных, но не для файловой системы, поэтому можно перезаписать другой.

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

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

.
17
ответ дан 27 November 2019 в 21:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: