午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > NoSQL反模式 - 文檔數(shù)據(jù)庫篇

NoSQL反模式 - 文檔數(shù)據(jù)庫篇

熱門標(biāo)簽:南京400電話怎樣辦理 福州電銷機(jī)器人源代碼 高德地圖標(biāo)注商戶位置 兗州電話外呼營銷系統(tǒng) 企業(yè)智能外呼系統(tǒng)價格多少 徐州ai電銷機(jī)器人原理 沈陽營銷電銷機(jī)器人招商 機(jī)器人外呼系統(tǒng)軟件存在問題 智能電銷機(jī)器人銷售話術(shù)

我們設(shè)計關(guān)系數(shù)據(jù)庫Schema的都有一套完整的方案,而NoSQL卻沒有這些。半年前筆者讀了本《SQL反模式》的書,覺得非常好。就開始留意,對于NoSQL是否也有反模式?好的反模式可以在我們設(shè)計Schema告訴哪里是陷阱和懸崖。NoSQL宣傳的時候往往宣稱是SchemaLess的,這會讓人誤解其不需要設(shè)計Schema。但如果不意識到設(shè)計Schema的必要,陷阱就在一直在黑暗中等著我們。這篇文章就總結(jié)一些別人的,也有自己犯過的深痛的設(shè)計Schema錯誤。

NoSQL數(shù)據(jù)庫最主流的有文檔數(shù)據(jù)庫,列存數(shù)據(jù)庫,鍵值數(shù)據(jù)庫。三者分別有代表作MongoDB,HBase和Redis。如果將NoSQL比作兵器的話,可以這樣(MySQL是典型的關(guān)系型數(shù)據(jù)庫,一樣參與比較):">

MySQL產(chǎn)生年代較早,而且隨著LAMP大潮得以成熟。盡管其沒有什么大的改進(jìn),但是新興的互聯(lián)網(wǎng)使用的最多的數(shù)據(jù)庫。就像傳統(tǒng)的菜刀,結(jié)構(gòu)簡單,幾百年沒有改進(jìn)。但是不妨礙產(chǎn)生各式各樣的刀法,只要有一把,就能勝任廚房里的大部分事務(wù)。MySQL也是一樣,核心已經(jīng)穩(wěn)定。但是切庫,分表,備份,監(jiān)控,等等手段一應(yīng)俱全。MongoDB是個新生事物,提供更靈活的Schema,Capped Collection,異步提交,地理位置索引等五花十色的功能。就像瑞士軍刀,不但可以當(dāng)?shù)队茫€可以開瓶蓋,剪指甲。但是他也不比MySQL強(qiáng),因為還缺乏時間的磨礪。一是系統(tǒng)本身的穩(wěn)定性,二是開發(fā),運維需要更多經(jīng)驗才能流行。HBase是個仗勢欺人的大象兵。依仗著Hadoop的生態(tài)環(huán)境,可以有很好的擴(kuò)展性。但是就像象兵一樣,使用者需要養(yǎng)一頭大象(Hadoop),才能驅(qū)使他。Redis是鍵值存儲的代表,功能最簡單。提供隨機(jī)數(shù)據(jù)存儲。就像一根棒子一樣,沒有多余的構(gòu)造。但是也正是因此,他的伸縮性特別好。就像悟空手里的金箍棒,大可捅破天,小能成縮成針。文檔數(shù)據(jù)庫的得失

關(guān)系模型試圖將數(shù)據(jù)庫模型和數(shù)據(jù)庫實現(xiàn)分開,讓開發(fā)者可以脫離底層很好的操作數(shù)據(jù)。但筆者以為關(guān)系模型在一些應(yīng)用場景下有弱點,現(xiàn)在已經(jīng)不得不面對。

SQL弱點一:必須支持Join。因為數(shù)據(jù)不能夠有重復(fù)。所以使用范式的關(guān)系模型會不可避免的大量Join。如果參與Join的是一張比內(nèi)存小的表還好。但是如果大表Join或者表分布在多臺機(jī)器上的話,Join就是性能的噩夢。SQL弱點二:計算和存儲耦合。關(guān)系模型作為統(tǒng)一的數(shù)據(jù)模型既可以用于數(shù)據(jù)分析,也可以用于在線業(yè)務(wù)。但這兩者一個強(qiáng)調(diào)高吞吐,一個強(qiáng)調(diào)低延時,已經(jīng)演化出完全不同的架構(gòu)。用同一套模型來抽象顯然是不合適的。Hadoop針對的就是計算的部分。MongoDB,Redis等針對在線業(yè)務(wù)。兩者都拋棄了關(guān)系模型。

針對這兩個夢魘。文檔數(shù)據(jù)庫如MongoDB的的主要目的是 提供更豐富的數(shù)據(jù)結(jié)構(gòu)來拋棄Join來適應(yīng)在線業(yè)務(wù)。當(dāng)然也不是MongoDB完全不能用Join,不能拿來做數(shù)據(jù)分析,討論這個只是見仁見智的問題。所以文檔數(shù)據(jù)庫并不比關(guān)系數(shù)據(jù)庫強(qiáng)大,由于對Join的弱支持,功能會弱許多。設(shè)計關(guān)系模型的時候,通常只需要考慮好數(shù)據(jù)直接的關(guān)系,定義數(shù)據(jù)模型。而設(shè)計文檔數(shù)據(jù)庫模型的時候,還需要考慮應(yīng)用如何使用。因此設(shè)計好一個的文檔數(shù)據(jù)庫Schema比設(shè)計關(guān)系模型更加的困難。除此之外,由于文檔數(shù)據(jù)庫事務(wù)的支持也是比較弱,一般NoSQL只會提供一個行鎖。這也給設(shè)計Schema更加增加了難度。對于文檔數(shù)據(jù)庫的使用有很多需要注意的地方,本文只關(guān)注模型設(shè)計的部分。

反模式一:慣性思維/沿用關(guān)系模型

關(guān)系模型是數(shù)據(jù)存儲的經(jīng)典模型,使用數(shù)據(jù)模型范式的好處非常的明顯。但是由于文檔數(shù)據(jù)庫不支持Join(包括和外鍵息息相關(guān)的外鍵約束)等特性,習(xí)慣性的沿用關(guān)系模型有的時候會出現(xiàn)問題。需要利用起文檔數(shù)據(jù)庫提供的豐富的數(shù)據(jù)模型來應(yīng)對。

值得一提的是文檔數(shù)據(jù)庫的設(shè)計和關(guān)系模型不同,是靈活多樣的。對于同一個情形,可以設(shè)計出有多種能夠工作的模型,沒有絕對意義上最好的模型。

下圖是關(guān)系模型和文檔模型的對比。

關(guān)系模型 VS 文檔模型

這個一個博客的數(shù)據(jù)模型,有Blog,User等表。左側(cè)是關(guān)系模型,右側(cè)是文檔模型。這個文檔模型并不是完全合理,可以作為“正反兩面教材”在下文不斷闡述。

問題一:存在描述多對多的關(guān)系表癥狀:文檔數(shù)據(jù)庫中存儲在有純粹的關(guān)系表,例如:

id user_id blog_id
0 0 0
1 0 1
這樣的表就算在關(guān)系模型中也是不妥的,因為這個ID非常的多余,可以用聯(lián)合主鍵來解決。但是在文檔數(shù)據(jù)庫中,由于必須強(qiáng)制單主鍵,不得不采取這樣的設(shè)計。

壞處:

破壞數(shù)據(jù)完備性。由于ID是主鍵,在數(shù)據(jù)模型上沒有約束來保證不出現(xiàn)重復(fù)的user_id,blog_id對。一旦數(shù)據(jù)出現(xiàn)重復(fù),更新刪除都是問題。索引過多。由于是關(guān)系表,必須在user_id和blog_id上面分別建一個索引。影響性能。

解決方案:使用文檔數(shù)據(jù)庫典型的處理多對多的辦法。不是建立一張關(guān)系表,而是在其中一個文檔(如User)中,加入一個List字段。

 

user_id user_name blog_id[] ……
0 Jake 0,1 ……
1 Rose 1,2 ……

問題二:沒有區(qū)分"一對多關(guān)系"和“多對一關(guān)系”癥狀:關(guān)系模型不區(qū)分“一對多”和“多對一”,對于文檔數(shù)據(jù)庫來講,關(guān)系模型只有“多對一”。就像這張Comment表:

comment_id user_id content ……
0 0 “NoSQL反模式是好文章” ……
1 0 “是啊” ……

如果整個模型都是這樣的“多對一”關(guān)系就需要反思了。

壞處:

額外索引。如果客戶端已知user_id,需要獲得User信息和Comment信息,需要執(zhí)行兩次查詢。其中一次查詢需要使用索引。并且要在客戶端自己Join。這樣可能有潛在性能問題。

解決方案:問題的核心在于是已知user_id查詢兩張表,還是已知comment_id查詢兩張表。如果是已知comment_id這樣的設(shè)計就是合理的,但是如果是已知user_id來查詢,把關(guān)系放在user表里的設(shè)計更合理一些。

user_id user_name comment_id[] ……
0 Jake 0,1 ……
1 Rose 1,2 ……

這樣的設(shè)計,就可以避免一個索引。同理,對于多對多也是一樣的,通過合理的安排字段的位置可以避免索引。

正確使用的場合:

關(guān)系型模型是非常成功的數(shù)據(jù)模型,合理的沿用是非常好的。但是由于文檔數(shù)據(jù)庫的特點,需要適當(dāng)?shù)恼{(diào)整,這樣得出的數(shù)據(jù)模型,盡管性能不是最優(yōu),但是有最好的靈活性。并且也有利于和關(guān)系數(shù)據(jù)庫轉(zhuǎn)換。

反模式二:處處引用客戶端Join

癥狀:數(shù)據(jù)庫設(shè)計中充滿了xx_id的字端,在查詢的時候需要大量的手動Join操作。就涉及到了這個反模式。正如上面提到的博客的關(guān)系模型,如果已知blog_id查詢comments,需要至少執(zhí)行3次查詢,并且手動Join。

壞處:

手動Join,麻煩且易出錯。文檔數(shù)據(jù)庫不支持Join且沒有外鍵保證。因此需要在客戶端Join,這樣的操作對于軟件開發(fā)來講是比較繁瑣的。由于沒有外鍵保證,因此不能保證取得的ID在數(shù)據(jù)庫里面是有數(shù)據(jù)的。在處理的時候需要不斷判斷,容易出錯。多次查詢。如果引用過多,查詢的時候需要多次查詢才能查到足夠的數(shù)據(jù)。本來文檔數(shù)據(jù)庫是很快的,但是由于多次查詢,給數(shù)據(jù)庫增加了壓力,獲取全部數(shù)據(jù)的時間也會增加。事務(wù)處理繁瑣。文檔數(shù)據(jù)庫一般不支持一般意義上事務(wù),只支持行鎖。如果文檔數(shù)據(jù)庫有給多個連接。在插入的時候,事務(wù)的處理就是噩夢。在文檔數(shù)據(jù)庫中使用事務(wù),需要使用行鎖,在進(jìn)行大量的處理。太過繁瑣,感興趣的讀者可以搜一下。

解決方案:適當(dāng)使用內(nèi)聯(lián)數(shù)據(jù)結(jié)構(gòu)。由于文檔數(shù)據(jù)庫支持更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)可以將引用轉(zhuǎn)換為內(nèi)聯(lián)的數(shù)據(jù),而不用新建一張表。這樣做可以解決上面的一些問題,是一個推薦的方案。就像上面博客的例子一樣。將五張表簡化成了兩張表。那什么時候使用內(nèi)聯(lián)呢?一般認(rèn)為

使用內(nèi)聯(lián)可以解決讀性能問題,明顯減少Q(mào)uery的次數(shù)的時候。可以簡化數(shù)據(jù)模型,化簡表之間的關(guān)系,而同時不會影響靈活性的時候。事務(wù)可以得到簡化為單行事務(wù)的時候正確使用的場合:

范式化的使用場景,文檔數(shù)據(jù)庫會被多個應(yīng)用使用。由于數(shù)據(jù)庫設(shè)計無法估計多個應(yīng)用現(xiàn)在及將來的查詢情況,需要極大的靈活性。在這個時候,使用引用比內(nèi)聯(lián)靠譜。

反模式三 濫用內(nèi)聯(lián)后患無窮

問題一 妨礙到查詢的內(nèi)聯(lián)癥狀:頻繁查詢一些內(nèi)聯(lián)字段,丟棄其他字段。

壞處:

無ID約束:使用內(nèi)聯(lián)字段和引用不同,是沒有ID約束的。因此不能通過ID(主鍵)來管理,如果經(jīng)常需要單獨操作內(nèi)聯(lián)對象會非常不便。索引泛濫:如果以內(nèi)聯(lián)字段為條件進(jìn)行查詢,需要建立索引。有可能造成索引泛濫。性能浪費:大部分文檔數(shù)據(jù)庫的實現(xiàn)是按行存儲的,也就意味著,盡管只查詢一個字段,但是DB需要將整行從磁盤中取出。如果字段夠小,文檔夠大,是很不合算的。

解決方案:如果出現(xiàn)以上的癥結(jié),就可以考慮使用引用代替內(nèi)聯(lián)了。內(nèi)聯(lián)特性主要的用途在于提高性能,如果出現(xiàn)性能不升反降,那就沒有意義了。如果對性能有很強(qiáng)烈的要求,可以考慮使用重復(fù)數(shù)據(jù),同樣的數(shù)據(jù)即在內(nèi)聯(lián)字段中也在引用的表里面。這樣可以結(jié)合內(nèi)聯(lián)和引用的性能優(yōu)勢。缺點是數(shù)據(jù)出現(xiàn)重復(fù),維護(hù)會比較麻煩。

問題二 無限膨脹的內(nèi)聯(lián)癥狀:List,Map類型的內(nèi)聯(lián)字段不斷膨脹,而且沒有限制。就像前面提到的Blog的內(nèi)聯(lián)字段Comment。如果對每一篇Blog的Comment數(shù)量沒有限制的話,Comment會無限膨脹。輕則影響性能,重則插入失敗。

Blog_id content Comment[] ……
0 “…” “NoSQL反模式是好文章”, “是啊”,”無限增長中”… ……
壞處:

插入失敗。文檔數(shù)據(jù)庫的每條記錄都有最大大小,并且也有推薦最佳的大小。一般不會超過4M。就像剛剛提到的例子,如果是篇熱門的博文的話,評論的大小很容易就超過4M。屆時文檔將無法更新,新的評論無法插入。性能拖油瓶。由于內(nèi)聯(lián)字段膨脹,其大小將遠(yuǎn)遠(yuǎn)超過其他部分,影響其他部分的性能表現(xiàn)。并且因此導(dǎo)致該記錄大小頻繁變化,對檔數(shù)據(jù)庫的數(shù)據(jù)文件內(nèi)部可能因此產(chǎn)生很多碎片。

解決方案:設(shè)定最大數(shù)目或者使用引用。還是Blog和Comment的例子,可以將Comment從Blog中剝離出成一張表。如果考慮到性能,可以在Blog表中新建一個字段如最近的評論。這樣既保證了性能,又能夠預(yù)防膨脹。

Blog_id content last_five_comment[] ……
0 “…” “NoSQL反模式是好文章”, “是啊”,”最多5條”… ……
問題三 無法維護(hù)的內(nèi)聯(lián)癥狀:DBA想單獨維護(hù)內(nèi)聯(lián)字段,但無法做到。

壞處:

權(quán)限管理難。數(shù)據(jù)庫的權(quán)限管理的最小粒度是表。如果使用內(nèi)聯(lián)技術(shù),就意味著內(nèi)聯(lián)部分必須和其他字段用同一個權(quán)限來管理。沒有辦法在DB級別隱藏。切表難。如果發(fā)現(xiàn)一張表的龐大需要切表。這個時候就比較糾結(jié)了。如果一刀切,partion Key的選擇;索引的失效都會成為問題。如果覺得拆為兩張表,就會很好操作的話,就是內(nèi)聯(lián)的過度使用了 。備份難。關(guān)系數(shù)據(jù)庫中每張表可以有不同的備份策略。但是如果內(nèi)聯(lián)起來,這樣的備份就做不到了。解決辦法:設(shè)計數(shù)據(jù)庫模型的時候需要考量之后的維護(hù)操作,尤其是內(nèi)聯(lián)的字段需不需要單獨的維護(hù)。需要和運維商量。如果對內(nèi)聯(lián)的字段有單獨維護(hù)的要求,可以拆分出來作為引用。

問題四 盯死應(yīng)用的內(nèi)聯(lián)癥狀:應(yīng)用可以非常好的運行在數(shù)據(jù)庫上。但是當(dāng)新的應(yīng)用接入的時候會很麻煩。因為設(shè)計數(shù)據(jù)模型的時候考慮到了查詢。所以當(dāng)有新應(yīng)用,新查詢接入的時候,就會難于使用原有的模型。

壞處:

新應(yīng)用接入難。當(dāng)新的應(yīng)用試圖使用同一個數(shù)據(jù)庫的時候,接入比較困難。因為查詢時不同的,需要調(diào)整數(shù)據(jù)模型才能適應(yīng)。但是調(diào)整模型又會影響原有應(yīng)用。集成難。不同的關(guān)系型數(shù)據(jù)庫可以集成在一起,共同使用。但是對于文檔數(shù)據(jù)庫,雖然功能上可以互補(bǔ),但是由于內(nèi)聯(lián)數(shù)據(jù)結(jié)構(gòu)的差異,也比較難于集成。ETL難。現(xiàn)在大部分的數(shù)據(jù)分析系統(tǒng)使用的是關(guān)系模型,就連Hadoop雖然不用關(guān)系模型,但是其上的Hive的常用工具也是按關(guān)系模型設(shè)計的。

解決方案:

使用范式設(shè)計數(shù)據(jù)庫,即用引用代替內(nèi)聯(lián)。或者在使用內(nèi)聯(lián)的時候,給每個內(nèi)聯(lián)對象一個全局唯一的Key,保證其和關(guān)系模型直接可以存在映射關(guān)系,這樣可以提高數(shù)據(jù)模型的靈活性。如Blog表:

Blog_id content Comment[] ……
0 “…” [{"id"=1,"content"=“NoSQL反模式是好文章”}, {"id"=2,"content"=“是啊”}…] ……

這樣的設(shè)計既可以利用到內(nèi)聯(lián)的好處,又能將其和關(guān)系模型映射起來。確定是需要手動維護(hù)comment_id,保證其全局唯一性。

反模式四:在線計算

癥狀:有一些運行時間很長的Query,由于有聚合計算,索引也不能解決。隨著數(shù)據(jù)量的增長,逐漸成為性能瓶頸。

壞處:

影響用戶體驗。在線業(yè)務(wù)中,如果一個查詢大于4s,用戶體驗會急劇下降。按主鍵和按索引的查詢都能滿足要求。但是聚合操作往往需要掃描全表或者大量的數(shù)據(jù),隨著數(shù)據(jù)量的增加,查詢時間會變長,用戶不可容忍。影響數(shù)據(jù)庫性能。長查詢的壞處數(shù)不清。在線上應(yīng)用中,如果出現(xiàn)長查詢,可能會霸占數(shù)據(jù)的大部分資源,包括IO,連接,CPU等等。導(dǎo)致其他很好的查詢,輕則性能也下降,重者無法使用數(shù)據(jù)庫。長查詢可以稱之為DB殺手。

解決方案:首先要權(quán)衡,這個聚合操作是不是必要的,必須實時完成。如果沒有必要實時完成的話,可以采取離線操作的方案。在夜深人靜的時候,跑一個長查詢,將結(jié)果緩存起來,給第二天使用。如果必須實時完成,則可以新建一個字段,用“incr”這樣的操作,在運行的時候,實時聚合結(jié)果。而不是查詢的時候執(zhí)行一次長查詢。如果邏輯比較復(fù)雜,或者覺得大量“incr”操作給數(shù)據(jù)庫系統(tǒng)帶來了壓力,可以使用Storm之類的實時數(shù)據(jù)處理框架。總之,要慎用長查詢。

反模式五:把內(nèi)聯(lián)Map對象的Key當(dāng)作ID用

癥狀:文檔數(shù)據(jù)庫支持內(nèi)聯(lián)Map類型。將其中Map的Key當(dāng)作數(shù)據(jù)庫的主鍵來用。

Blog_id content Comment{} ……
0 “…” {"1"=“NoSQL反模式是好文章”, "2"=“是啊”} ……
這個反模式很容易犯,因為在編程語言中Map數(shù)據(jù)結(jié)構(gòu)就是這么用的。但是對于數(shù)據(jù)庫模型來說,這是不折不扣的反模式。

壞處:

無法通過數(shù)據(jù)庫做各種(>=)查詢。對于關(guān)系型數(shù)據(jù)庫來說,雖然數(shù)據(jù)結(jié)構(gòu)可以很靈活,但查詢的時候都是按層次的。比如comment.id,comment.content。也就是說其Map類型中的Key可以理解為屬性名的,而不是用作ID。因此一旦這樣使用,就脫離的數(shù)據(jù)庫管制,無法使用各種查詢功能。無法通過索引查詢。文檔數(shù)據(jù)可建立索引是需要列名的。比如comment.id。而這樣的數(shù)據(jù)結(jié)構(gòu)沒有固定的列名,因此無法建立索引。

解決方案:使用數(shù)組+Map來解決。如:

Blog_id content Comment[] ……
0 “…” [{"id"=1,"content"=“NoSQL反模式是好文章”}, {"id"=2,"content"=“是啊”}…] ……
這樣,就可以使用comment.id作為索引,也可以使用數(shù)據(jù)庫的查詢功能。簡單有效。Map類型中的Key是屬性名,Value是屬性值。這樣的用法是文檔數(shù)據(jù)庫數(shù)據(jù)模型的本意,因此其提供的各種功能才能利用上。否則就無法使用。

反模式六:不合理的ID

癥狀:使用String甚至更復(fù)雜數(shù)據(jù)結(jié)構(gòu)作為的ID,或者全部使用數(shù)據(jù)庫提供的自生成ID。如:

id(該ID系系統(tǒng)自生成) Blog_id content ……
0 0 ... ……
壞處:

ID混亂。如果使用數(shù)據(jù)庫提供的自生成ID,同時表中還有一個類似有主鍵含義的Blog_id,這樣很不好,容易造成邏輯混亂。由于文檔數(shù)據(jù)庫不支持ID的重命名,習(xí)慣關(guān)系數(shù)據(jù)庫做法的人可能會再建立一個自己的邏輯ID字段。這是沒有必要的。索引龐大,性能低下。ID是數(shù)據(jù)庫的非常重要的部分。ID的長度將決定索引(包括主鍵的索引)的大小,直接影響到數(shù)據(jù)庫性能。如果索引比內(nèi)存小,性能會很好。但一旦索引大小超過內(nèi)存,出現(xiàn)數(shù)據(jù)交換,性能會急劇下降。一個Long占8字節(jié),一個20個字符的UTF8 String占用約60個字節(jié)。相差10倍之巨,不能不考慮。

解決方案:盡量使用有一定意義的字段做ID,并且不在其他字段中重復(fù)出現(xiàn)。不使用復(fù)雜的數(shù)據(jù)類型做ID,只使用int,long或者系統(tǒng)提供的主鍵類型做ID。

文檔數(shù)據(jù)庫的反模式總結(jié)

闡述了這么多的反模式,下面有個一覽表,涵蓋了上面所有的反模式。這個一覽表,是按照文檔數(shù)據(jù)庫模型建立的。是個文檔數(shù)據(jù)庫模型的例子。

ID 反模式名 問題
0 存在描述多對多的關(guān)系表 [{ID:00
癥狀:文檔數(shù)據(jù)庫中存儲在有純粹的關(guān)系表
壞處:[破壞數(shù)據(jù)完備性,索引過多]
解決方案:加入一個List字段
},{
ID:01
癥狀:關(guān)系模型不區(qū)分“一對多”和“多對一”
壞處:額外索引
解決方案:合理的安排字段的位置
}]
1 處處引用客戶端Join [{
ID:10
癥狀:查詢的時候需要大量的手動Join操作
壞處:[手動Join,多次查詢, 事務(wù)處理繁瑣]
解決方案:適當(dāng)使用內(nèi)聯(lián)數(shù)據(jù)結(jié)構(gòu)。
}]
2 濫用內(nèi)聯(lián)后患無窮 [{
ID:20
癥狀:頻繁查詢一些內(nèi)聯(lián)字段,丟棄其他字段
壞處:[無ID約束,索引泛濫, 性能浪費]
解決方案:使用引用代替內(nèi)聯(lián)了,允許重復(fù)數(shù)據(jù)
},{
ID:21
癥狀:List,Map類型的內(nèi)聯(lián)字段不斷膨脹,而且沒有限制
壞處:[插入失敗, 性能拖油瓶]
解決方案:設(shè)定最大數(shù)目或者使用引用。
},{
ID:22
癥狀:DBA想單獨維護(hù)內(nèi)聯(lián)字段,但無法做到
壞處:[權(quán)限管理難, 切表難, 備份難]
解決方案:設(shè)計數(shù)據(jù)庫模型的時候需要考量之后的維護(hù)操作
},{
ID:23
癥狀:應(yīng)用可以非常好的運行在數(shù)據(jù)庫上。但是當(dāng)新的應(yīng)用接入的時候會很麻煩。內(nèi)聯(lián)盯死了應(yīng)用
壞處:[新應(yīng)用接入難, 集成難, ETL難]
解決方案:使用范式設(shè)計數(shù)據(jù)庫,即用引用代替內(nèi)聯(lián)。保證其和關(guān)系模型直接可以存在映射關(guān)系
}]
3 在線計算 [{
ID:30
癥狀:有一些運行時間很長的Query, 逐漸成為性能瓶頸。
壞處:[影響用戶體驗,影響數(shù)據(jù)庫性能]
解決方案:取消不必要的聚合操作. 運行的時候,實時聚合結(jié)果.使用第三方實時或非實時工具。如Hadoop,Storm.
}]
4 把內(nèi)聯(lián)Map對象的Key當(dāng)作ID用 [{
ID:40
癥狀:文檔數(shù)據(jù)庫支持內(nèi)聯(lián)Map類型。將其中Map的Key當(dāng)作數(shù)據(jù)庫的主鍵來用。
壞處:[無法通過數(shù)據(jù)庫做各種(>""" =)查詢,無法通過索引查詢]
解決方案:使用數(shù)組+Map來解決。
}]
5 不合理的ID [{
ID:50
癥狀:用String甚至更復(fù)雜數(shù)據(jù)結(jié)構(gòu)作為的ID,或者全部使用數(shù)據(jù)庫提供的自生成ID。
壞處:[ID混亂,索引龐大]
解決方案:盡量使用有一定意義的字段做ID。不使用復(fù)雜的數(shù)據(jù)類型做ID。
}]

本文試圖總結(jié)了筆者知道的重要的文檔數(shù)據(jù)庫的反模式。現(xiàn)在關(guān)于NoSQL數(shù)據(jù)模型設(shè)計模式的討論才剛剛起步,將來也許會逐漸自成體系。對于列數(shù)據(jù)庫和Key-Value的反模式,筆者等到有了足夠積累的時候,再和大家分享。

您可能感興趣的文章:
  • 如何開啟mysql中的嚴(yán)格模式
  • 學(xué)習(xí)SQL語句(強(qiáng)大的group by與select from模式)
  • 老生常談MYSQL模式匹配 REGEXP和like的用法
  • Mysql SQL服務(wù)器模式介紹
  • PHP基于單例模式實現(xiàn)的mysql類
  • mysql中binlog_format模式與配置詳細(xì)分析
  • mysql啟用skip-name-resolve模式時出現(xiàn)Warning的處理辦法
  • MySQL中SQL模式的特點總結(jié)

標(biāo)簽:吉安 丹東 本溪 鶴崗 邯鄲 昭通 大理 景德鎮(zhèn)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《NoSQL反模式 - 文檔數(shù)據(jù)庫篇》,本文關(guān)鍵詞  NoSQL,反,模式,文檔,數(shù)據(jù)庫,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《NoSQL反模式 - 文檔數(shù)據(jù)庫篇》相關(guān)的同類信息!
  • 本頁收集關(guān)于NoSQL反模式 - 文檔數(shù)據(jù)庫篇的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    久久精品免费播放| 欧美制服第一页| 九一在线免费观看| 日韩有码在线观看| 日日夜夜免费精品| 日本道在线视频| 91精品1区2区| 中文字幕理论片| 台湾成人av| 欧美一区二区大片| 国产浮力第一页| 色噜噜噜噜噜噜| 国产成人av资源| 久草精品在线播放| 最近2019中文字幕mv免费看 | 国产蜜臀av在线一区二区三区| 美女少妇一区二区| 午夜精品视频在线| 亚洲精品伦理在线| 在线播放亚洲精品| 国产精品自在自线| 亚洲综合精品一区二区| 欧美一区二区在线视频| 国产一区亚洲一区| 中文字幕手机在线观看| 300部国产真实乱| 欧美国产日产韩国视频| 99久久精品国产观看| 色狠狠久久av五月综合| 国产精品r级在线| 国产毛片精品一区| 日韩精品久久久| 日韩成人在线视频观看| 欧美国产综合色视频| 91av在线免费视频| 免费网站永久免费观看| 九九精品在线视频| 一区二区三区四区av| 亚洲a视频在线观看| 狠狠人妻久久久久久综合蜜桃| 日本一区高清不卡| 欧美国产日韩二区| 欧美精选在线播放| 成人午夜电影网站| 99久久精品无免国产免费| 午夜免费福利网站| 日本精品久久中文字幕佐佐木| 91一区二区三区在线观看| 中文字字幕码一二三区| 青青草成人网| 国产精品扒开腿做| 亚洲精品在线三区| 91丨九色丨黑人外教| 国产大片aaa| 色婷婷一区二区三区av免费看| 国产精品久久久久久久一区探花| 日韩欧美精品在线| 亚洲日本成人在线观看| 美国一区二区三区在线播放| 欧美国产日韩综合| 精品国产一区三区| 久热国产精品视频一区二区三区 | 国产有码在线观看| 免费观看a级片| 中文字幕一区二区三区四区在线视频| 国产精品日韩一区二区免费视频| 免费av一区二区| 欧美午夜影院在线视频| 久久久欧美精品sm网站| 国产精品午夜免费| 国产高清自拍视频| 91黄色小网站| 超级碰在线观看| 亚洲视频电影| 色姑娘综合av| 日韩欧美在线电影| 一区高清视频| 一区二区不卡在线| 日韩欧美视频一区二区| 国产伦精品一区二区三区高清| 欧美黑人一级爽快片淫片高清| 亚洲乱码国产乱码精品精| 亚洲白虎美女被爆操| 日韩欧美久久久| 日韩精品在线一区二区| 欧美日韩高清在线| 欧美日韩精品是欧美日韩精品| 欧美日韩国产色| 亚洲二区在线视频| 亚洲午夜在线电影| 欧美mv日韩mv国产网站| 日韩精品视频在线观看免费| 亚洲美女偷拍久久| 亚洲综合免费观看高清完整版在线 | 51午夜精品国产| 亚洲精品狠狠操| 久久99久久亚洲国产| 欧美大胆a视频| 3344国产精品免费看| 欧美一区二区三区免费视| 91精品国产91久久久久久久久| 国内精品小视频在线观看| 久久久之久亚州精品露出| 亚州精品天堂中文字幕| 国产日韩欧美影视| 明星裸体视频一区二区| 日本精品福利视频| www.四虎成人| 精品一区二区三区四区五区六区| 一本加勒比波多野结衣| 国产精品无码无卡无需播放器| 日本黄色小视频在线观看| 久久亚洲AV无码| av网站免费播放| 久久国产欧美日韩精品| 国产精品区一区二区三区| 色婷婷精品久久二区二区蜜臂av | 91成人伦理在线电影| 五月天色婷婷综合| 国产精品va无码一区二区| 制服丝袜综合网| 中文字幕视频观看| 精品人妻一区二区三区香蕉 | 男女爽爽爽视频| 在线观看av中文字幕| 男女羞羞免费视频| 国产裸体无遮挡| 欧美自拍第一页| 成人av免费在线观看| 亚洲日本丝袜连裤袜办公室| 色欲综合视频天天天| 亚洲精品少妇网址| 国产91色在线|免| 久久精品国产美女| 国产超级av在线| 公侵犯人妻一区二区三区| 97在线观看免费高| 国产极品久久久| 成熟亚洲日本毛茸茸凸凹| 一二三区精品视频| 亚洲国产精品久久91精品| 国a精品视频大全| 久久99蜜桃综合影院免费观看| 国产青青在线视频| 日本少妇xxxxx| 97视频免费在线| 成人18精品视频| 一本色道久久综合亚洲91| 色偷偷偷综合中文字幕;dd| 91久久在线播放| 日韩欧美一区三区| 搜索黄色一级片| 97人妻精品一区二区三区视频 | 五月天激情视频在线观看| 婷婷伊人五月天| 国产精品久久影视| 欧美国产精品中文字幕| 欧美一区二区三区免费视频| 久久久久久久久久久久久久久久久久av| 国产精品第二页| 激情综合网婷婷| 精品一区二区三孕妇视频| 六月丁香综合网| 一区二区三区在线视频观看58 | 韩国av免费观看| 成人av影院在线| 日韩欧美激情在线| 91九色在线免费视频| 日韩在线视频在线观看| 在线看的片片片免费| 国产麻豆一精品一av一免费 | 久久亚洲综合| 欧美日韩一区在线| 91精品免费看| 久久久无码人妻精品无码| 丰满肥臀噗嗤啊x99av| 亚洲成人午夜电影| 4444欧美成人kkkk| 色一情一乱一伦一区二区三区日本| 国产网友自拍视频| 成人黄页在线观看| 亚洲视频欧洲视频| 91传媒免费视频| 天堂中文在线网| 亚洲日本丝袜连裤袜办公室| 欧美大片免费观看在线观看网站推荐| 黄色成人在线免费观看| 人人爽人人爽人人片av| 综合欧美亚洲日本| 欧美亚洲在线视频| 欧美污在线观看| 国产美女精品视频国产| 欧美中文一区二区三区| 国产精华一区二区三区| 在线免费看黄色片| 国产一区二区久久| 久久好看免费视频| 杨幂毛片午夜性生毛片 | 欧美高清在线精品一区| 日韩性生活视频| 日本日本19xxxⅹhd乱影响| 在线免费看91| 色综合天天综合给合国产| 精品国产aⅴ麻豆| 九九九久久久久| 亚洲成人av中文| 国产精品一 二 三| 麻豆成人在线视频| 香蕉成人伊视频在线观看| 国产精品yjizz| 人妻丰满熟妇av无码区| 亚洲一区国产视频| 欧美一区二区影视| 国产精品久久久久久久一区二区| 欧美一级淫片007| 免费特级黄色片| 亚洲av无码国产综合专区 | 国产免费观看av| 日韩精品最新网址| www.99热这里只有精品| 精品久久国产视频| 中文字幕最新精品| www.com日本| 国产精品女主播av| 99精品国产一区二区| 国产无遮挡免费视频| 欧洲一区二区三区在线| 福利视频一二区| 粉嫩av一区二区三区在线播放 | 中文无字幕一区二区三区| 国产欧美在线一区二区| 一区二区三区播放| 亚洲图片欧洲图片av| 国产伦精品一区二区免费| 1区2区3区欧美| 超碰免费在线公开| 精品亚洲成a人| 国产成人久久久精品一区| 国产精品不卡av| 亚洲精品国产精品乱码不99按摩| 91国视频在线| 久久精品亚洲一区二区三区浴池 | 欧美日韩dvd| 99久久国产综合色|国产精品| 国产一区二区不卡视频在线观看| 国产成人精品白浆久久69| 欧美大片欧美激情性色a∨久久| 欧美高清视频一区二区三区| 精品粉嫩超白一线天av| 成人中文字幕av| 亚洲男人都懂的| 免费看一级大黄情大片| 中文字幕精品三区| 影音先锋男人的网站| 92精品国产成人观看免费| 免费国产一区二区| 视频一区二区中文字幕| 日韩中文视频免费在线观看| 国产调教在线观看| 激情亚洲一区二区三区四区| 国产一级特黄a大片免费| 国产女主播视频一区二区| 日韩久久久久久久久久久久久| 麻豆高清免费国产一区| 成人黄色av网| 成人国产在线观看| 日韩精品久久久免费观看| 岛国av在线一区| 午夜探花在线观看| 亚洲欧洲日韩av| 亚洲精品在线视频播放| 欧美日韩一区成人| theav精尽人亡av| 精品国产一区a| 草视频在线观看| 国产成人拍精品视频午夜网站 | 国产按摩一区二区三区| 国产精品高潮粉嫩av| 精品综合久久久久久8888| 精品国产乱码一区二区三区四区 | 国产嫩草影院久久久久| 欧美视频亚洲图片| 欧美mv日韩mv国产| 国产情侣自拍av| 成人免费淫片aa视频免费| 91天堂素人约啪| 男人女人拔萝卜视频| 亚洲精品美女视频| 日本黄视频在线观看| 裸体大乳女做爰69| 欧美日韩国产一区| 精品在线播放视频| 丁香婷婷久久久综合精品国产| 99国产一区二区三精品乱码| 欧美国产日韩另类 | 国产男人精品视频| 91蜜桃免费观看视频| 欧美第一页浮力影院| 亚洲国产欧美在线成人app| 国产精品九九九九| 亚洲在线欧美| 欧亚一区二区三区| 亚洲 小说区 图片区| 欧美精品人人做人人爱视频| 日韩欧美国产骚| 男女视频免费看| 51国偷自产一区二区三区| 中文字幕一区二区三区四区| 短视频在线观看| 国产精品视频网站| 国产午夜精品在线观看| japanese在线观看| 91国产高清在线| 国产精品嫩草99a| 久久久久亚洲av无码专区体验| 国产综合18久久久久久| 欧美日韩精品久久久| 亚洲成人777777| 成人亚洲免费视频| 国产97色在线| 日韩欧美极品在线观看| 国产av无码专区亚洲av| 亚洲网中文字幕| www日韩欧美| 小毛片在线观看| 青青草一区二区| 久久婷婷国产综合国色天香| 少妇久久久久久久久久| 91tv亚洲精品香蕉国产一区7ujn| 国产亚洲午夜高清国产拍精品| 成年人在线免费看片| 成人国产精品一区| 亚洲成av人综合在线观看| 熟女少妇a性色生活片毛片| 国产精品国产三级国产专区53| 亚洲女同女同女同女同女同69| 国产专区第一页| www.99riav| 亚洲男子天堂网| 麻豆成人久久精品二区三区小说| 乱码一区二区三区| 91久久精品国产91性色| 亚洲综合男人的天堂| 国产内射老熟女aaaa∵| 成人毛片100部免费看| 另类美女黄大片| 中文字幕中文字幕中文字幕亚洲无线| 五月天丁香激情| 无码粉嫩虎白一线天在线观看| 亚洲精品在线免费观看视频| 丁香五精品蜜臀久久久久99网站 | 4k岛国日韩精品**专区| 色综合色狠狠综合色| 日韩中文字幕免费观看| 人妻无码中文久久久久专区| 国产狼人综合免费视频| 欧美在线综合视频| 狠狠色丁香久久婷婷综合_中| 中文字幕乱码一区| 日韩中文字幕一区二区| 日韩欧美成人午夜| 99re视频精品| 丁香六月婷婷综合| 在线观看国产中文字幕| 国产成人免费电影| 亚洲免费视频观看| 亚洲激情综合网| 国产美女主播在线观看| 人人干人人干人人| 风间由美一区二区三区| 深夜福利日韩在线看| 天天色 色综合| 国产综合久久久久影院| 日韩伦理在线视频| 免费看黄色一级大片| 痴汉一区二区三区| 日韩在线不卡视频| 精品露脸国产偷人在视频| 高清不卡在线观看av| 亚洲网站免费观看| 你懂得视频在线观看| 欧美日韩在线观看不卡| 96成人在线视频| 欧美激情免费视频| 亚洲高清在线观看| 岛国精品视频在线播放| av爱爱亚洲一区| 日韩国产精品久久| 中文字幕 视频一区| 欧美人妻一区二区三区| 男女曰b免费视频| 裸模一区二区三区免费| 国产不卡av在线| 亚洲欧美国产高清va在线播| 色婷婷亚洲一区二区三区| 91视频国产资源| 性xxxxbbbb| 国产精品毛片一区二区在线看舒淇 | 亚洲一区在线视频| 国产亚洲成aⅴ人片在线观看 | 国产精品亚洲综合天堂夜夜| 亚洲午夜精品久久久久久性色 | 一区二区三区四区乱视频| 成人高清免费观看| 麻豆成人综合网| 亚洲国产欧美另类| 狠狠狠狠狠狠狠| 国产真人真事毛片| 亚洲怡红院在线| 不卡中文字幕在线|