Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 适用于web照片库的正确NoSQL数据模式_Python_Sql_Nosql_Amazon Dynamodb - Fatal编程技术网

Python 适用于web照片库的正确NoSQL数据模式

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张最新照片(带有相册数据)的

我希望为照片库的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张最新照片(带有相册数据)的列表,请执行如下查询:

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(编号、范围键)
  • 。。。其他领域
现在,在我编写其他字段的地方,您可以保存所有照片数据并保存另一个对正确数据表的请求,但如果照片存在于许多albun中,这将创建冗余数据

您可以在此表中为“主”相册保存所有照片数据,在其他相册中,使用列指定主相册ID。由于NoSQL数据库不需要严格的架构,因此表中不需要列


如果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不是意味着不需要任何数据模式吗?这真的很有帮助。非常感谢。