搜索

首页  >  问答  >  正文

javascript - 请问,一个文章有多个标签,一个标签下面有多篇文章,用 mogoose 怎么设计表?

使用场景是这样子的:

发表文章时候,带有标签,一遍文章有很多个标签,

然后用查询一个标签时候,怎么查询到这个标签所有的文章??

然后整个 mongoodb 的数据设计的思路是怎么样子?求大神解答一下嘛,thx

给我你的怀抱给我你的怀抱2733 天前840

全部回复(4)我来回复

  • phpcn_u1582

    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);
                });
            })
        });
    };

    然后在对应的路由调用

    回复
    0
  • 習慣沉默

    習慣沉默2017-06-30 09:54:50

    文章保存的时候向标签tags数组(外键)中添加对应标签id,同时在对应的所有标签中增加文章id(外键)

    回复
    0
  • phpcn_u1582

    phpcn_u15822017-06-30 09:54:50

    这是典型多对多模型,表设计如下

    文章表article

    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='文章表';

    标签表tags

    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='标签表';

    文章和标签关联表article_tag

    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表即可

    • 上述两种情况下,如果还需要标签或文章的数据,就继续左联标签表或者文章表即可。

    回复
    0
  • 女神的闺蜜爱上我

    女神的闺蜜爱上我2017-06-30 09:54:50

    同意楼上的解决办法,文章一个表,标签一个表,然后再建一个文章标签的对应关系表

    回复
    0
  • 取消回复