【问题标题】:Storing the contents of a photo album in NoSQL在 NoSQL 中存储相册的内容
【发布时间】:2012-02-06 18:14:45
【问题描述】:

关于这个问题:

Proper NoSQL data schema for web photo gallery

在 MySQL 中,检索专辑的内容应该是这样的:

SELECT photos.*, albums.album_title
FROM photos, albums_to_photos, albums
wHERE albums_to_photos.photo_id = photos.photo_id AND
      albums_to_photos.album_id = albums.album_id AND
      album_title = 'Family Vacation'

这将检索相册“Family Vacation”中所有照片的列表

我想到的一种方法是创建一个名为“相册”的表,并将所有照片的照片 ID 存储在值字段中。例如:

{_id:'Family Vacation',
 values:'25, 512, 6172, 16923, 168253, 79185892'}

然后对这些值中的每一个执行多项选择,以将照片 ID 查找到实际照片项。这是一个好方法吗?

【问题讨论】:

    标签: python nosql amazon-dynamodb


    【解决方案1】:
    {
       "_id": ObjectId("4f30153eecd1ab7c49ded566"),
       "album": "Family Vacation",
       "photo": "25"
    },
    {
       "_id": ObjectId("4f30153eecd1ab7c49ded565"),
       "album": "Family Vacation",
       "photo": "512"
    }
    

    单独存储每张照片,如果您想在某个时候添加更多照片信息(例如标题),则更易于管理。还可以考虑使用 id 来引用您的相册。然后您可以执行以下操作:

    ->find(array("专辑" => "家庭假期"))

    【讨论】:

    • 上面的架构将用于一个名为“albums?”的表
    • 它们在 NoSQL 中称为集合,但是是的,您将创建一个名为专辑的新集合。此外,集合是无模式的。
    【解决方案2】:

    Stur,如果我错了,请纠正,但是按列过滤会进行全表扫描,对吗? 如果是这样,我相信 Ensnare 提出的解决方案会更好地处理更大的数据。

    Ensnare,假设对于标签,您使用 dynamodb,您可以使用 Set of Integer 作为照片 ID,但您需要使用每行 64kb 的限制。

    您还可以创建二级索引,使用专辑名称作为主键,photoid 作为范围键。

    【讨论】:

    • 我认为在 NoSQL 中将照片 ID 存储为逗号分隔的字符串没有任何优势。它违反了 1NF,因此您会遇到各种问题 - 无法订购您的选择,无法确保数据类型,更不用说能够从相册中添加/删除照片了。
    • 在 dynamoDB 中(假设他使用它)不需要用逗号分隔,您可以使用 Set of String 或 Number 与它(虽然不确定它如何在内部处理)。但我认为你是对的,有一些大的并发症,命令和添加/删除肯定会很痛苦。那么解决方案就是创建自己的二级索引,你同意吗?
    猜你喜欢
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 2011-02-26
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    相关资源
    最近更新 更多