列举一个mongodb应用场景,更适合使用嵌入文档(反范式化)设计
列举一个mongodb应用场景,更适合使用嵌入文档(反范式化)设计
目前我们正在准备开发一个类似于evernote的云笔记的产品,为用户提供通过Android手机和PC终端的笔记的管理,用户可以新建文字笔记、手写笔记、语音笔记和照片笔记。MongoDb就是我们服务器侧保存文档的首选数据库,同时为了保证数据的一致性和高性能,我们对文档进行反范式化设计。参考MongoDB设计模式,对笔记数据进行了如下设计。
文字笔记:
{ _id: ObjectId(...)), metadata: { nonce: ObjectId(...), type: 'text-note'title: 'note-2013-06-28', created: ISODate(...), author: { _id: ObjectId(…), name: 'David' }, tags: [...], detail: { publish_on: ISODate(…), text: 'Today is Friday\n...' } } }
手写笔记:该笔记分为元数据和数据块存放在MongoDB里,其中文件通过GridFS进行存储,元数据的集合格式如下:
{ _id: ObjectId(…), length: 123..., chunkSize: 262144, uploadDate: ISODate(…), contentType: 'image/jpeg', md5: 'ba49a...', metadata: { nonce: ObjectId(…), type: 'handwriting', locked: ISODate(...), parent_id: ObjectId(...), title: 'Handwriting note', created: ISODate(…), author: { _id: ObjectId(…), name: 'Jared' }, tags: […], detail: { filename: ' Handwriting_note.jpg', resolution: [1600, 1600], … } } }
录音笔记:该笔记分为元数据和数据块存放在MongoDB里,其中文件通过GridFS进行存储,元数据的集合格式如下:
{ _id: ObjectId(…), length: 123..., chunkSize: 262144, uploadDate: ISODate(…), contentType: 'audio/basic', md5: 'far5a...', metadata: { nonce: ObjectId(…), type: 'audio', locked: ISODate(...), parent_id: ObjectId(...), title: 'Audio note', created: ISODate(…), author: { _id: ObjectId(…), name: 'feifei' }, tags: […], detail: { filename: ' audio_note.au', … } }
}照片笔记:该笔记分为元数据和数据块存放在MongoDB里,其中文件通过GridFS进行存储,元数据的集合格式如下:
{ _id: ObjectId(…), length: 123..., chunkSize: 262144, uploadDate: ISODate(…), contentType: 'image/jpeg', md5: 'de39a...', metadata: { nonce: ObjectId(…), type: 'photo', locked: ISODate(...), parent_id: ObjectId(...), title: 'photo note', created: ISODate(…), author: { _id: ObjectId(…), name: 'duanduan' }, tags: […], detail: { filename: ' photo_note.jpg', resolution: [1600, 1600], … } } }