Правильная схема данных NoSQL для веб-фотогалереи - PullRequest
20 голосов
/ 21 января 2012

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

С MySQL я бы настроил (3) таблицы следующим образом:

photos (photo_id, title, date_uploaded, filename)
albums (album_id, title, photo_id)
album_photo_map (photo_id, album_id)

И затем, чтобы получить список из 5 последних фотографий (с данными альбома), запрос, подобный этому:

SELECT *
FROM albums, photos, album_photo_map
WHERE albums.album_id = album_photo_map.album_id AND
                photos.photo_id = album_photo_map.photo_id
ORDER BY photos.date_uploaded DESC LIMIT 5;

Как мне выполнить аналогичный запрос, используя базу данных пар ключ-значение NoSQL? (В частности, Amazono DynamoDB.) Как будет выглядеть хранилище? Как будет работать индексация?

Ответы [ 3 ]

12 голосов
/ 06 февраля 2012

Используя mongodb lingo, ваши коллекции могут выглядеть следующим образом:

photos = [
    {
        _id: ObjectId(...),
        title: "...",
        date_uploaded: Date(...),
        albums: [
            ObjectId(...),
            ...
        ]
    },
    ...
]

albums = [
    {
        _id: ObjectId(...),
        title: "..."
    }
]

Найти 5 новых фотографий можно было бы следующим образом:

> var latest = db.photos.find({}).sort({date_uploaded:1}).limit(5);

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

> var latest_albums = latest.find({}, {albums: 1});

Конечно, тогда тебе нужно свести это в набор.

Это на самом деле проще, если тыПросто вставьте альбом в фотодокументы, так как они маленькие:

photos = [
    {
        _id: ObjectId(...),
        title: "...",
        date_uploaded: Date(...),
        albums: [
            {name: "family-vacation-2011", title: "My family vacation in 2010"},
            ...
        ]
    },
    ...
]

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

> db.photos.find({albums:{$elemMatch:{name: "family-vacation-2011"}}});
3 голосов
/ 09 февраля 2012

Redis может справиться с этим.Для таблицы RMDBS, о которой вы упомянули выше:

SET photos: photo_id: title "некоторые слова заглавных слов"
SET photos: photo_id: date_uploaded "некоторое время загрузки (2011-02-09 ЧЧ: ММ: ССнапример) "
SET фотографии: photo_id: имя файла" некоторые слова из слов ""

SET альбомы: album_id: название "некоторые слова из названий альбомов"

SADD album_photo_map: photo_id album_id

Использование списка (списка поддержки Redis) для хранения последних загруженных фотографий и обновления списка при загрузке новой фотографии:

ret = r.lpush ("upload: last_upload_times", photo_id)// обновляем список
ret = r.ltrim ("upload: last_upload_times", 0, N-1) // контролируем длину списка

тогда, если мы хотим получить последние загруженные N фотографий с альбомомданные:

last_uploaded_photo_list = r.lrange ("upload: last_upload_times", 0, N-1) last_uploaded_photo_with_album_list = [(photo_id, album_id) для photo_id в last_uploaded_photo_list для альбома*

1 голос
/ 03 февраля 2012

Используя DynamoDB, «схема» для таблицы фотографий может быть:

Album_Photo

  • Идентификатор альбома (строка, первичный ключ)
  • Идентификатор фотографии (Число, ключ диапазона)
  • ... Другие поля

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

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

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

...