当前位置:数据库 > DB2 >>

mongodb中使用数组建立多对多关系

mongodb中使用数组建立多对多关系
 
数组在nosql数据库中扮演着特别的角色,某些场景下使用数组将会特别方便,例如如下场景
 
数据量较小,十万以下
有多对多的关系存在
包含正反向查询
不频繁更新数组中的数据
例如博客文章中的标签,可能会有一篇文章包含多个标签,一个标签对应多篇文章
 
tag --> [
    article1,
    article2,
    article3,
    article4
]
 
article --> [
    tag1,
    tag2,
    tag3,
    tag4,
]
在这种场景下,可能会需要利用标签查询特定文章,以及反向查询:查询文章包含的标签,在nosql数据库中完全可以使用数组来组织这种多对多的关系
 
考虑设计collection 结构,文章collection:article,标签collection:article2tag
 
article {
    title:'',
    content:'',
    tag:[],
    atime:''
}
 
article2tag {
    tag:''
    articleList:[],
    atime:'',
    size:0
}
article的tag键是数组类型,值为单个article的标签 article2tag的articleList键是数组类型,值为包含此标签的文章
 
每次文章添加新标签的时候,更新文章和标签的对应关系
 
#!/usr/bin/env python
#更新文章标签
db.article.update({'_id':article_id},{'$set':{'tag':tags}})
 
#在二者对应关系中清除之前该文章的所有关系,使用数组的$pull操作,及删除该文章和标签的所有关系,并将数组长度减小1
db.article2tag.update({'article2list':article_id},{'$pull':{'articleList':article_id},'$inc':{'size':-1}},multi=True)
 
#建立新的关系
for i in tags:
    db.article2tag.update({'tag':i},{'$push':{'article2list':article_id},'$inc':{'size':1}})
 
#清除不包含文章的标签
db.article2tag.remove({'size':{'$lte':0}},multi=True)
注意
 
当数组变得很大时,$push和$pull对性能将产生比较大的影响,所以在使用$push和$pull的场景中一定是小数据量且不发生频繁更新的场景,如果你的数组会变得很大,那么考虑把数组中的数据单独提取为一个collection吧 ->:)!
 
Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,