搜尋

首頁  >  問答  >  主體

javascript - 請問,一個文章有多個標籤,一個標籤下面有多篇文章,用 mogoose 怎麼設計表?

使用場景是這樣子的:

發表文章時候,有標籤,一遍文章有很多個標籤,

然後用查詢一個標籤時候,怎麼查詢到這個標籤所有的文章? ?

然後整個 mongoodb 的資料設計的想法是怎麼樣子?求大神解答一下嘛,thx

给我你的怀抱给我你的怀抱2702 天前819

全部回覆(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
  • 取消回覆