javascript - 請問,一個文章有多個標籤,一個標籤下面有多篇文章,用 mogoose 怎麼設計表?
给我你的怀抱
给我你的怀抱 2017-06-30 09:52:50
0
4
800

使用場景是這樣子的:

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

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

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

给我你的怀抱
给我你的怀抱

全部回覆(4)
phpcn_u1582

文章包含_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);
            });
        })
    });
};

然後在對應的路由呼叫

習慣沉默

文章保存的時候在標籤tags數組(外鍵)中加入對應標籤id,同時在對應的所有標籤中增加文章id(外鍵)

phpcn_u1582

這是典型多對多模型,表設計如下

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

  • 上述兩種情況下,如果還需要標籤或文章的數據,就繼續左聯標籤表或文章表即可。

女神的闺蜜爱上我

同意樓上的解決方法,文章一個表,標籤一個表,然後再建一個文章標籤的對應關係表

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!