如何在couchdb中为简单相册构建数据库设计?

时间:2011-02-09 12:32:40

标签: database-design nosql couchdb

我想通过开发一个PhotoAlbum应用程序来尝试CouchDb,其中不同的用户可以拥有许多包含许多照片的相册。如果我为每个用户创建一个包含一系列专辑的文档,其中包含带附件的照片,我是否正确?

{ 
    user: "Dominik", 
    albums: [ 
        { name: "USA Trip", photos: 
            [ 
                { title: "Golden Gate Bridge", _attachments: [ the photo ] },
                { another photo } 
            ]
        },
        { ...} ] 
}

还是有其他好办法吗?

或者将每个用户,专辑和照片存储在不同的文档中是否更好?这需要像mysql中的外键吗?

{ type: "user", name: "Dominik", albums: [ "a1", "a2", "a3" ] }
{ type: "album", _id: "a1", title: "USA Trip", photos: [ "p1", "p2" ... ] }
{ type: "photo", _id: "p1", _attachments: {...}, title: "Golden Gate Bridge" }

...

或者反过来?:

{ type: "user", _id: "u1", name: "Dominik" }
{ type: "album", _id: "a1", title: "USA Trip", user: "u1" }
{ type: "photo", _id: "p1", _attachments: {...}, title: "Golden Gate Bridge", album: "a1" }

2 个答案:

答案 0 :(得分:1)

从我的观点来看,最好将数据分成几小部分。但这只是你的选择。我之所以选择划分是因为我面临每个“key-value-instance”的memcached-server限制1Mb(我们在memcached中缓存CouchDB文档),所以我们无法将数据存储在一个文档中。

但是,将数据存储在一个文档中当然有好处。我希望其他人会讲述他们的经历,你会选择最适合自己的经历。

答案 1 :(得分:1)

1999是对的。还有两点:

  1. 请记住, Apache CouchDB支持原子事务 - 但仅限于文档中。您可以使用单个原子操作更改文档中的任何内容。
  2. 在CouchDB安全框架中,您的安全策略将被隔离应用于一个文档。当必须确定用户可能执行的操作时,validate_doc_update函数无法查看外部文档。 (如果您不使用CouchDB进行帐户和身份验证,则无关紧要。)