适用于Web照片库的NoSQL数据模式

ens*_*are 20 python sql nosql amazon-dynamodb

我正在寻找为照片库的NoSQL存储构建适当的数据结构.在我的网络应用程序中,照片可以是一个或多个相册的一部分.我有使用MySQL的经验,但几乎没有使用键值存储.

使用MySQL,我会设置(3)表如下:

photos (photo_id, title, date_uploaded, filename)
albums (album_id, title, photo_id)
album_photo_map (photo_id, album_id)
Run Code Online (Sandbox Code Playgroud)

然后,要检索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;
Run Code Online (Sandbox Code Playgroud)

如何使用NoSQL键值对数据库完成类似的查询?(具体来说,亚马逊的DynamoDB.)存储会是什么样子?索引如何工作?

nfi*_*ine 12

使用mongodb lingo,您的集合可能如下所示:

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

albums = [
    {
        _id: ObjectId(...),
        title: "..."
    }
]
Run Code Online (Sandbox Code Playgroud)

找到5张最新照片就像这样:

> var latest = db.photos.find({}).sort({date_uploaded:1}).limit(5);
Run Code Online (Sandbox Code Playgroud)

在mongo中没有服务器端连接,所以你必须获取所有最新的专辑,如下所示:

> var latest_albums = latest.find({}, {albums: 1});
Run Code Online (Sandbox Code Playgroud)

当然,你必须把它煮成一套.

如果你只是将相册嵌入到照片文档中,这实际上更容易,因为它们很小:

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

然后查询是一样的,但你不必加入.查找相册中的所有照片如下:

> db.photos.find({albums:{$elemMatch:{name: "family-vacation-2011"}}});
Run Code Online (Sandbox Code Playgroud)

  • 这真的很有帮助.谢谢. (2认同)