适用于 Web 照片库的正确 NoSQL 数据架构

2024-04-28

我正在寻找为照片库的 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 键值对数据库完成类似的查询? (具体来说,亚马逊的 DynamoDB。)存储会是什么样子?索引将如何工作?


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

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);

mongo 中没有服务器端连接,因此您必须像这样获取所有最新专辑:

> 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"}}});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

适用于 Web 照片库的正确 NoSQL 数据架构 的相关文章

随机推荐