乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Python3.7+Django2.0.4配合Mongodb打造高性能高擴展標(biāo)簽云存儲方案

       看見就非常 2020-05-13

          書接上回,之前有一篇文章提到了標(biāo)簽云系統(tǒng)的構(gòu)建:Python3.7+jieba(結(jié)巴分詞)配合Wordcloud2.js來構(gòu)造網(wǎng)站標(biāo)簽云(關(guān)鍵詞集合),但是這篇只是淺顯的說明了一下如何進行切詞以及前端如何使用wordcloud2.js進行前端展示,本次主要討論下標(biāo)簽分詞切出來之后,如何進行存儲。

          假設(shè)我們目前文章-標(biāo)簽體系的需求是這樣:

          每篇文章都具有唯一的標(biāo)題、描述以及 URL。

          每篇文章都具有一個或多個標(biāo)簽。

          每篇文章都具有作者的名稱,以及喜歡

          每篇文章都有用戶的評論,用戶名、消息、日期時間以及評論的喜歡度。

          每篇文章都可以有 0 個或多個評論。

          那么如果使用關(guān)系型數(shù)據(jù)庫來設(shè)計,比較簡單的設(shè)計方案可以是這樣:

          

          可以注意到,標(biāo)簽和文章的對應(yīng)關(guān)系還是簡單的一對多,如果做成比較靈活的多對多還需要增加一張關(guān)系表,這樣就是四張表了。

          如果使用nosql比如Mongodb來說,只需要一張表(聚合)就可以實現(xiàn):

          

      {  
         _id: POST_ID
      title: TITLE_OF_POST,
      description: POST_DESCRIPTION,
      by: POST_BY,
      url: URL_OF_POST,
      tags: [TAG1, TAG2, TAG3],
      likes: TOTAL_LIKES,
      comments: [
      {
      user:'COMMENT_BY',
      message: TEXT,
      dateCreated: DATE_TIME,
      like: LIKES
      },
      {
      user:'COMMENT_BY',
      message: TEXT,
      dateCreated: DATE_TIME,
      like: LIKES
      }
      ]
      }

          可以看到標(biāo)簽是由數(shù)組實現(xiàn)的,那么關(guān)系型數(shù)據(jù)庫mysql和非關(guān)系型數(shù)據(jù)庫mongodb在標(biāo)簽實現(xiàn)中本質(zhì)上有什么區(qū)別呢?

          關(guān)系數(shù)據(jù)庫如mysql中標(biāo)簽云的實現(xiàn)是簡單的,標(biāo)簽和文章分別在不同的表中,通過join可以比較簡單的查詢出標(biāo)簽的統(tǒng)計數(shù)據(jù)。 而MongoDB為快速水平擴張以及極高的性能而優(yōu)化,在MongoDB中沒有join,傾向于使用embedding來代替linking關(guān)系。

          假設(shè)我們的需求又有了變化,普通博客變身成為具有數(shù)百萬篇文章的小說站.每個小說都有許多布爾屬性,大約一萬個可能的屬性,每篇小說都有十幾個章節(jié),假設(shè)我希望能夠?qū)崟r(幾毫秒)請求給出的前n項任何屬性組合的標(biāo)簽。

          你會選擇推薦什么解決方案?毫無疑問,如果你在尋找極具擴展性的方案,Mongodb無疑更好。

          而且從業(yè)務(wù)角度上來講,無論是通過標(biāo)簽查文章,還是文章查標(biāo)簽這樣的需求,都非常靈活,當(dāng)然了根據(jù)文章查標(biāo)簽一般沒問題,一般都是根據(jù)標(biāo)簽查文章的時候有性能問題,如果是純關(guān)系數(shù)據(jù)庫比如mysql很難解決性能問題,所以要借助 es 索引解決。es 索引的時候可以將 tagid 用逗號分隔,可以很快的根據(jù)一個 tagid,或者多個 tagid 查詢到關(guān)聯(lián)的文章 id,一般文章列表都是分頁的,有這些文章 id 了,再去關(guān)系數(shù)據(jù)庫里面取文章就行了,但是es又是另外一件事了,回頭我們再討論。

          隨后使用Django2.0.4來實現(xiàn),首先安裝好python的mongodb操作庫pymongo

      pip3 install pymongo

          值得一提的是,它會有一個相對應(yīng)bson模塊 也就是說 PyMongo模塊的實現(xiàn)是基于和它一起的bson模塊的。

          bson是一種類json的一種二進制形式的存儲格式,簡稱Binary JSON,它和JSON一樣,支持內(nèi)嵌的文檔對象和數(shù)組對象,但是BSON有JSON沒有的一些數(shù)據(jù)類型,如Date和BinData類型;BSON有三個特點:輕量性、可遍歷性、高效性,但是空間利用率不是很理想。

          基于Django插入標(biāo)簽的視圖:

      import pymongo
      from bson import json_util as jsonb
      mongo_client = pymongo.MongoClient(host='localhost', port=27017)
      from django.http import HttpResponse,HttpResponseRedirect,JsonResponse
      from django.views import View

      class InsertTagsHandler(View):

      def get(self,request):
      db = mongo_client.test12
      table = db.test12
      res = table.find({"title":'123'}).count()
      print(res)

      if res > 0:
      result = '重復(fù)數(shù)據(jù)'
      return HttpResponse(json.dumps({'result':result},ensure_ascii=False))
      else:
      table.insert({'title':'123','desc':['123','123']})
      return HttpResponse(json.dumps({'result':'添加成功'},ensure_ascii=False))

          基于django通過文章查詢標(biāo)簽

      class FindArticleHandler(View):

      def get(self,request):
      db = mongo_client.test12
      table = db.test12


      res = table.find_one({"title":'123'},{"desc":1})

      return HttpResponse(jsonb.dumps(res,ensure_ascii=False))

          基于django分組查詢獲取所有標(biāo)簽以及標(biāo)簽出現(xiàn)次數(shù)的統(tǒng)計

      class TagsStatHandler(View):

      def get(self,request):
      db = mongo_client.test12
      table = db.test12


      pipeline = [{'$unwind':"$tags"},{'$group': {'_id': "$tags", 'count': {'$sum': 1}}},]
      res = table.aggregate(pipeline)

      return HttpResponse(jsonb.dumps(res,ensure_ascii=False))

          基于django通過標(biāo)簽反查文章

      class Tags2ArticleHandler(View):

      def get(self,request):
      db = mongo_client.test12
      table = db.test12


      res = table.find({"tags":{'$in':["123"]}})

      return HttpResponse(jsonb.dumps(res,ensure_ascii=False))

          結(jié)語:經(jīng)此一役,Mongodb的特點躍然紙上:結(jié)構(gòu)靈活,表結(jié)構(gòu)更改相對自由,不用每次alter的時候付出代價,適合業(yè)務(wù)快速迭代,而且json原生和大多數(shù)的語言有天然的契合。還支持?jǐn)?shù)組,嵌套文檔等數(shù)據(jù)類型。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多