小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

 看見就非常 2020-05-13

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

    假設我們目前文章-標簽體系的需求是這樣:

    每篇文章都具有唯一的標題、描述以及 URL。

    每篇文章都具有一個或多個標簽。

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

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

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

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

    

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

    如果使用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
}
]
}

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

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

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

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

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

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

pip3 install pymongo

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

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

    基于Django插入標簽的視圖:

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 = '重復數(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通過文章查詢標簽

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分組查詢獲取所有標簽以及標簽出現(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通過標簽反查文章

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è)務快速迭代,而且json原生和大多數(shù)的語言有天然的契合。還支持數(shù)組,嵌套文檔等數(shù)據(jù)類型。

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多