Python 适用于web照片库的正确NoSQL数据模式
我希望为照片库的NoSQL存储构建适当的数据结构。在我的web应用程序中,照片可以是一个或多个相册的一部分。我有使用MySQL的经验,但几乎没有使用键值存储的经验 使用MySQL,我会设置(3)个表,如下所示:Python 适用于web照片库的正确NoSQL数据模式,python,sql,nosql,amazon-dynamodb,Python,Sql,Nosql,Amazon Dynamodb,我希望为照片库的NoSQL存储构建适当的数据结构。在我的web应用程序中,照片可以是一个或多个相册的一部分。我有使用MySQL的经验,但几乎没有使用键值存储的经验 使用MySQL,我会设置(3)个表,如下所示: photos (photo_id, title, date_uploaded, filename) albums (album_id, title, photo_id) album_photo_map (photo_id, album_id) 然后,要检索5张最新照片(带有相册数据)的
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;
photos = [
{
_id: ObjectId(...),
title: "...",
date_uploaded: Date(...),
albums: [
ObjectId(...),
...
]
},
...
]
albums = [
{
_id: ObjectId(...),
title: "..."
}
]
> var latest = db.photos.find({}).sort({date_uploaded:1}).limit(5);
> var latest_albums = latest.find({}, {albums: 1});
如何使用NoSQL键值对数据库完成类似的查询?(特别是亚马逊的DynamoDB。)存储空间会是什么样子?索引将如何工作?使用DynamoDB,照片表的“模式”可以是:
相册照片
- 唱片集ID(字符串,主键)
- 照片ID(编号、范围键)
- 。。。其他领域
如果photoID具有某种自动递增行为,则可以轻松获取相册的最后X张图片。如果没有,您可以使用日期作为范围键,使用照片ID作为列。使用范围键反转也是一个好主意,可以轻松查询最后一行。使用mongodb行话,您的集合可以如下所示:
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;
photos = [
{
_id: ObjectId(...),
title: "...",
date_uploaded: Date(...),
albums: [
ObjectId(...),
...
]
},
...
]
albums = [
{
_id: ObjectId(...),
title: "..."
}
]
> var latest = db.photos.find({}).sort({date_uploaded:1}).limit(5);
> var latest_albums = latest.find({}, {albums: 1});
查找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;
photos = [
{
_id: ObjectId(...),
title: "...",
date_uploaded: Date(...),
albums: [
ObjectId(...),
...
]
},
...
]
albums = [
{
_id: ObjectId(...),
title: "..."
}
]
> var latest = db.photos.find({}).sort({date_uploaded:1}).limit(5);
> var latest_albums = latest.find({}, {albums: 1});
mongo中没有服务器端加入,因此您必须获取所有最新的相册,如下所示:
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;
photos = [
{
_id: ObjectId(...),
title: "...",
date_uploaded: Date(...),
albums: [
ObjectId(...),
...
]
},
...
]
albums = [
{
_id: ObjectId(...),
title: "..."
}
]
> 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"}}});
Redis可以处理这个问题。对于上面提到的RMDBS表: 设置照片:照片\u id:title“一些照片标题词”
设置照片:照片\u id:date\u上传“一些上传时间(例如2011-02-09 HH:MM:SS)”
设置照片:照片\u id:filename“一些文件名单词” 设置相册:相册\u id:title“一些相册标题词”
SADD相册\u照片\u地图:照片\u id相册\u id 使用列表(Redis支持列表)存储上次上传的照片,并在上传新照片时更新列表: ret=r.lpush(“上传:上次上传次数”,照片id)//更新列表
ret=r.ltrim(“上传:上次上传次数”),0,N-1)//控制列表长度 然后,如果我们想获取最后上载的N张照片和相册数据: 上次上传照片列表=r.lrange(“上传:上次上传次数”,0,N-1)
last_uploaded_photo_with_album_list=[(photo_id,album_id)用于r.smembers中相册id的last_uploaded_photo_列表(photo_id)]为什么要使用nosql方法?这正是关系数据库非常有用的事情。希望转移到DynamoDB以促进通过Amazon Web服务进行扩展。他们提供了一个关系解决方案:我知道——但我们对DynamoDB的自动扩展非常感兴趣,NoSQL不是意味着不需要任何数据模式吗?这真的很有帮助。非常感谢。