列举一个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],
…
}
}
}