Оптимизируйте номенклатуру хранения фотографий на Amazon S3 - PullRequest
0 голосов
/ 25 июня 2018

Мне нужно хранить много фотографий (+1 000 000, один макс. 5 МБ), и у меня есть база данных, каждая запись имеет 5 фотографий, так что самое лучшее решение:

  • Создать каталогдля каждой записи slug / id и загрузки фотографий внутри нее
  • Поместите все фотографии в один каталог, а в имени укажите id или кусок записи
  • Поместите все фотографии в один каталог и в базу данных.к каждой записи добавьте поле с именами фотографий.

Я использую сервер Amazon S3.

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Я бы посоветовал вам назвать ваши фотографии так при загрузке в пакетном режиме:

user1 / image1.jpeg

user2 / image2.jpeg

Хотя эти имена не будут влиять на способ хранения объектов на s3, эти имена будут просто 'keys' из 'objects' , посколькунет никакой папки, подобной иерархической структуре в s3, но при этом объекты будут появляться в папках, что поможет легко разделять изображения, если вы захотите это сделать позже.

Например, предположим, вы сохранили все изображения с уникальнымиимена, и вы используете уникальный UUID для сопоставления записей в базе данных с изображениями в вашем ведре.

Но позже предположим, что вам нужны все 5 фотографий определенного пользователя, тогда вам нужно будет

  1. сканировать базу данных на предмет определенного имени пользователя
  2. ПолучитьUUID для изображений этого пользователя
  3. и последующее использование UUID для извлечения изображений из s3

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

Например, чтобы вывести список всех фотографий пользователя user1, вы можете использовать этот небольшой фрагмент кода в python:

import boto3
s3 = boto3.resource('s3')
Bucket=s3.Bucket('bucket_name')
for obj in Bucket.objects.filter(Prefix='user1/'):
    print(obj.key)

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

0 голосов
/ 26 июня 2018

Многое зависит от вашего варианта использования, например, от того, как будет использоваться база данных и фотографии.Здесь недостаточно информации для однозначного ответа.

Однако некоторые рекомендации для стороны хранения ...

Самый простой вариант - просто использовать UUID за каждую фотографию.Это фактически случайное имя , которое не имеет смысла.Сохраните это имя в своей базе данных, и ваша система будет знать, какое изображение относится к какой записи.Нет необходимости переименовывать изображения, потому что имена являются просто уникальными идентификаторами и не содержат никакой дополнительной информации.

Если вы хотите предоставить доступ к определенному изображению, ваше приложение может сгенерировать Amazon S3 pre.подписанный URL , который предоставляет ограниченный по времени доступ к объекту .После истечения срока действия URL не работает, поэтому объект остается закрытым.Предоставление доступа таким способом означает, что нет необходимости группировать изображения в каталогах по «владельцу», поскольку доступ предоставляется для каждого объекта, а не для каждого владельца.

Также обратите внимание, что Amazon S3на самом деле не поддерживает папки .Скорее, Key («имя файла») объекта является полным путем (например, user-2/foo.jpg).Это делает его более читаемым человеком (поскольку объекты «кажутся» находящимися в папках), но фактически не влияет на способ хранения данных за кадром.

Итог: Неважно, как вы храните изображения.Важно то, что вы сохраняете имя изображения в своей базе данных, чтобы знать, какое изображение соответствует какой записи.Избегайте ситуаций, когда вам нужно переименовывать изображения - просто дайте им имя и сохраните его.

...