成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

mongodb 的 schema 設(shè)計(jì)方法

jay_tian / 3365人閱讀

摘要:下面就來總結(jié)一些設(shè)計(jì)的原則和方法。在城市信息嵌入在人中就更不合適了,因?yàn)檫€會(huì)產(chǎn)生大量數(shù)據(jù)冗余,更新信息也特別麻煩。另一個(gè)做法就是嵌在一起,這樣會(huì)有性能的提升,不過這種做法會(huì)導(dǎo)致數(shù)據(jù)冗余,看具體的情況來取舍。

mongodb 的schema設(shè)計(jì)方法 前言

mongodb是NoSQL的代表,從使用關(guān)系型數(shù)據(jù)庫(MySQL)到使用非關(guān)系型數(shù)據(jù)庫(mongodb),其中的一些以前的設(shè)計(jì)的思維慣性總是在不知不覺的影響著自己的決策。設(shè)計(jì)的思想有共同之處,也有很大的不同。mongodb的優(yōu)勢(shì)在于他表示數(shù)據(jù)的方式非常豐富。下面就來總結(jié)一些設(shè)計(jì)的原則和方法。

原則

schema的設(shè)計(jì)最重要的不是當(dāng)前設(shè)計(jì)的可擴(kuò)展性,對(duì)設(shè)計(jì)的可讀性,還是說原來的設(shè)計(jì)三范式。最重要的在于,你的app一般展現(xiàn)出來的數(shù)據(jù)是什么結(jié)構(gòu),就設(shè)計(jì)成什么樣。取出即用。舉個(gè)例子來說,如果設(shè)計(jì)一個(gè)博客的schema,按照原來的方法, 你可能會(huì)設(shè)計(jì)成:

posts
{
  _id: ,
  title: ,
  body: ,
  author: ,
  date: 
}

comments
{
  _id: ,
  post_id: ,
  author: ,
  order: 
}

tags
{
  _id: ,
  tag: ,
  post_id:
}

但是更好的設(shè)計(jì)是:

{
  _id: ,
  author: ,
  body: ,
  comments : [
    {
      body: ,
      email: ,
      author: ,
    },
    ...
    {
     ...
    }
  ],
  date: ,
  tags: [
    ...
  ],
  title: 
}

?

原來的設(shè)計(jì)范式的目標(biāo)

盡可能的減少數(shù)據(jù)庫數(shù)據(jù)修改的難度(減少數(shù)據(jù)冗余)

最小化數(shù)據(jù)庫設(shè)計(jì)擴(kuò)展的改動(dòng)

避免數(shù)據(jù)庫訪問時(shí)的歧義

在mongodb中:

默認(rèn)的來說設(shè)計(jì)的時(shí)候是要避免數(shù)據(jù)冗余的

不存在這樣的問題,因?yàn)閙ongo中的schema非常靈活,你可以隨時(shí)的改動(dòng)

由于設(shè)計(jì)的時(shí)候就盡可能的按照應(yīng)用需要的數(shù)據(jù)的形式設(shè)計(jì),取出即用,所以第三個(gè)問題出現(xiàn)的概率也比較少

沒有約束怎么辦?

在mongo中,最經(jīng)常思考的問題就是,沒有外鍵怎么保持?jǐn)?shù)據(jù)一致性?正如上述博客的第一種設(shè)計(jì)中,你在新插入一個(gè)評(píng)論的時(shí)候,數(shù)據(jù)庫是不會(huì)保證你這個(gè)post_id是不是真在在posts這個(gè)collection里面有對(duì)應(yīng)值。

解決的辦法就是像第二種設(shè)計(jì)中的做法,把他嵌入在posts這個(gè)collection.由于這個(gè)時(shí)候評(píng)論已經(jīng)是post的一部分,就再也不用擔(dān)心插入的評(píng)論沒有對(duì)應(yīng)到一篇博客的問題。

沒有事務(wù)怎么辦?

在目前,mongodb是不支持事務(wù)的。也就是說,如果你一個(gè)業(yè)務(wù)需要修改好幾條記錄,你是沒辦法保證當(dāng)其中一個(gè)操作失敗的以后將其它操作回滾的,這種時(shí)候又應(yīng)該怎么辦?

雖然mongo沒有提供事務(wù),但是他提供了非常豐富的原子操作,我們應(yīng)該充分利用這一點(diǎn)。在關(guān)系型數(shù)據(jù)庫中,你可能有幾張表,然后要通過join的方式去鏈接。所以你需要事務(wù)去同時(shí)修改幾張表。但是在mongo中,在設(shè)計(jì)的時(shí)候你已經(jīng)prejoin了(就是你已經(jīng)把它們都嵌入在了同一個(gè)collection),你只需要直接一次修改整個(gè)post就可以實(shí)現(xiàn)事務(wù)的效果。

總的來說,解決的辦法有三個(gè):

重建你的設(shè)計(jì),使得你能通過原子操作一次把它們都修改完

在你的軟件中實(shí)現(xiàn)鎖的機(jī)制,用尋找和修改寫一系列的測(cè)試來實(shí)現(xiàn)。

在大量的數(shù)據(jù)或者不嚴(yán)格的場(chǎng)景中,容忍這種錯(cuò)誤

典型的設(shè)計(jì)場(chǎng)景 一對(duì)一的關(guān)系

比如說應(yīng)聘者和簡(jiǎn)歷的關(guān)系。除非嵌在一起會(huì)導(dǎo)致你的數(shù)據(jù)大于16MB(mongo的限制),你都應(yīng)該嵌在一起。做好的做法就是將一個(gè)比較少使用的嵌入一個(gè)經(jīng)常食用的當(dāng)中。

一對(duì)多的關(guān)系

比如說城市和人的關(guān)系,博客和評(píng)論

對(duì)于像城市和人的關(guān)系這樣的,一個(gè)城市實(shí)在是對(duì)應(yīng)了太多太多的人。如果將人嵌入在城市中,不太合適。在城市信息嵌入在人中就更不合適了,因?yàn)檫€會(huì)產(chǎn)生大量數(shù)據(jù)冗余,更新信息也特別麻煩。這種情況下最好的做法就是分開兩個(gè)collection,然后人的collection中每一條都有一個(gè)city字段,來對(duì)應(yīng)城市collection中的一條。

如果是像博客和評(píng)論這樣一個(gè)對(duì)應(yīng)的不是特別多的時(shí)候,最好的最法還是嵌進(jìn)去

多對(duì)多的關(guān)系

例如書和作者的關(guān)系,老師和學(xué)生的對(duì)應(yīng)關(guān)系

對(duì)于像書和作者這樣,比較少對(duì)應(yīng)比較少的,一個(gè)可行的做法就是分開兩個(gè)collection。書collection中存一個(gè)authors數(shù)組,作者 collection中存一個(gè)books數(shù)組,互相對(duì)應(yīng)。這種做法不好的地方就在與要手動(dòng)維護(hù)數(shù)據(jù)一致性。另一個(gè)做法就是嵌在一起,這樣會(huì)有性能的提升,不過這種做法會(huì)導(dǎo)致數(shù)據(jù)冗余,看具體的情況來取舍。特別的像老師和學(xué)生這種關(guān)系,最好最好就是不要將老師嵌在學(xué)生中,因?yàn)楹芸赡芤粋€(gè)新來的老師就還沒有學(xué)生,這樣你就沒辦法把這位老師加入到系統(tǒng)中。

樹形結(jié)構(gòu)

一個(gè)典型的場(chǎng)景就是像amazon這樣的電商,一個(gè)商品分類下可能有很多個(gè)子分類。

其中的一個(gè)做法就是建立一個(gè)分類的collection,然后每個(gè)分類有一個(gè)parent_id字段,但是這樣不便于找到他所有的祖先。所以比較好的做法是再加一個(gè)ancesters的數(shù)組字段,記錄他所有的祖先的id,這樣就能方便的查詢到他的祖先和后代。

嵌入的優(yōu)勢(shì)

提高讀的效率。這意味著你要獲取數(shù)據(jù)只需要查詢一次數(shù)據(jù)庫就行了。

處理大文件

如果一個(gè)數(shù)據(jù)量特別大(大于16M),比如讀入一個(gè)100多M的mp4文件。這種情況下就需要用到GRIDFS.原理就是把他分割成一個(gè)一個(gè)小的塊

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/18868.html

相關(guān)文章

  • vue2.0開發(fā)聊天程序(六) 搞定mongodb

    摘要:為安裝文件,無需再配置環(huán)境變量。連接操作有以下包作者并未查到除此之外的包,但不代表沒有。等于是每個(gè)默認(rèn)配置的主鍵屬性,屬性名為可自己定義一個(gè)來覆蓋此屬性。需要注意的是,在新版本的文檔中,為。通過創(chuàng)建限于篇幅,本小節(jié)暫時(shí)寫到這里。 我的琴聲嗚咽,我的淚水全無。我把遠(yuǎn)方的遠(yuǎn)歸還草原?!                  ? 海子《九月》 mongodb安裝 什么是Mongodb?就是一個(gè)基...

    Dr_Noooo 評(píng)論0 收藏0
  • 在Node中基于Mongoose對(duì)MongoDB進(jìn)行增刪查改(CRUD)操作(一)

    摘要:如圖連接成功后,顯示你的數(shù)據(jù)庫,在這個(gè)節(jié)目可以對(duì)數(shù)據(jù)庫進(jìn)行操作。如圖安裝與加載首先假定你已經(jīng)安裝了,命令行工具輸入在使用的文件中即可。創(chuàng)建讀取更新刪除單值讀取上文是在中基于對(duì)進(jìn)行增刪查改操作的簡(jiǎn)單介紹,以后會(huì)有進(jìn)階的文章。 關(guān)鍵詞:mongodb安裝 mongoose使用 robomongo mongoose的CRUD操作 mongoose的查詢,增加,修改,刪除 工具介紹 Mon...

    lemon 評(píng)論0 收藏0
  • 在Node中基于Mongoose對(duì)MongoDB進(jìn)行增刪查改(CRUD)操作(一)

    摘要:如圖連接成功后,顯示你的數(shù)據(jù)庫,在這個(gè)節(jié)目可以對(duì)數(shù)據(jù)庫進(jìn)行操作。如圖安裝與加載首先假定你已經(jīng)安裝了,命令行工具輸入在使用的文件中即可。創(chuàng)建讀取更新刪除單值讀取上文是在中基于對(duì)進(jìn)行增刪查改操作的簡(jiǎn)單介紹,以后會(huì)有進(jìn)階的文章。 關(guān)鍵詞:mongodb安裝 mongoose使用 robomongo mongoose的CRUD操作 mongoose的查詢,增加,修改,刪除 工具介紹 Mon...

    SillyMonkey 評(píng)論0 收藏0
  • 一個(gè)基于Vue.js+Mongodb+Node.js博客內(nèi)容管理系統(tǒng)

    摘要:三更新內(nèi)容在原來項(xiàng)目的基礎(chǔ)上,做了如下更新數(shù)據(jù)庫重新設(shè)計(jì),改成以用戶分組的數(shù)據(jù)庫結(jié)構(gòu)應(yīng)數(shù)據(jù)庫改動(dòng),所有接口重新設(shè)計(jì),并統(tǒng)一采用和網(wǎng)易立馬理財(cái)一致的接口風(fēng)格刪除原來游客模式,增加登錄注冊(cè)功能,支持彈窗登錄。 這個(gè)項(xiàng)目最初其實(shí)是fork別人的項(xiàng)目。當(dāng)初想接觸下mongodb數(shù)據(jù)庫,找個(gè)例子學(xué)習(xí)下,后來改著改著就面目全非了。后臺(tái)和數(shù)據(jù)庫重構(gòu),前端增加了登錄注冊(cè)功能,僅保留了博客設(shè)置頁面,但是...

    wh469012917 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<