使用场景是这样子的:
发表文章时候,带有标签,一遍文章有很多个标签,
然后用查询一个标签时候,怎么查询到这个标签所有的文章??
然后整个 mongoodb 的数据设计的思路是怎么样子?求大神解答一下嘛,thx
phpcn_u15822017-06-30 09:54:50
文章包含_id,title,tags,content
然后,tags又含有很多的tag
_id
title
tags
tag1
tag2
tag3
content
可以这样去设计
可以写一个返回特定标签下的所有文章的方法
Post.getTag=function(tag,callback){
mongodb.open(function(err,db){
if(err){
return callback(err);
}
db.collection('posts',function(err,collection){
if(err){
mongodb.close();
return callback(err);
}
collection.find({
"tags":tag
},{
"name":1,
"time":1,
"title":1
}).sort({
time:-1
}).toArray(function(err,docs){
mongodb.close();
if(err){
return callback(err);
}
callback(null,docs);
});
})
});
};
然后在对应的路由调用
phpcn_u15822017-06-30 09:54:50
这是典型多对多模型,表设计如下
CREATE TABLE `article` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '文章ID',
`title` varchar(100) NOT NULL DEFAULT '' COMMENT '标题',
`content` longtext COMMENT '文章内容',
...,
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='文章表';
CREATE TABLE `tags` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '标签ID',
`name` varchar(30) NOT NULL DEFAULT '' COMMENT '标签名',
PRIMARY KEY (`id`),
) ENGINE=InnoDB COMMENT='标签表';
CREATE TABLE `article_tag` (
`article_id` int(11) unsigned DEFAULT '0' COMMENT '文章ID',
`tag_id` int(11) unsigned DEFAULT '0' COMMENT '标签ID',
KEY `FK_article_tag_tag_id` (`tag_id`),
KEY `FK_article_tag_article_id` (`article_id`),
CONSTRAINT `FK_article_tag_article_id` FOREIGN KEY (`article_id`) REFERENCES `article` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_article_tag_tag_id` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB COMMENT='文章标签表';
通过article_tag的外键约束,将article表和tags表关联起来
对于文章标签的操作,如果标签已经存在,只需要对article_tag表数据进行添加或者删除
如果标签不存在,先添加标签和文章,再给article_tag中加入文章ID<->标签ID
数据即可
如果要查询一个标签中的所有文章,用article_tag表左联(或者内联)article表即可
如果要查询一个文章的所有标签,用article_tag表左联(或者内联)tags表即可
上述两种情况下,如果还需要标签或文章的数据,就继续左联标签表或者文章表即可。