前端培訓 - Node 階段(49)- noSQL基礎概念

前端最基礎的就是 HTML+CSS+Javascript。掌握了這三門技術就算入門,但也僅僅是入門,如今前端開發的定義已經遠遠不止這些。前端小課堂(HTML/CSS/JS),本着提高技術水平,打牢基礎知識的中心思想,咱們開課啦(每週四)。html

數據庫分爲兩種:關係數據庫(RDBMS)和非關係數據庫(NoSQL)前端

  • 關係數據庫: mysql、oracle、SQL server
  • 非關係數據庫:HBase、Redis、MongoDB、Couchbase、LevelDB

NoSQL

NoSQL ( NoSQL = Not Only SQL),指的是非關係型的數據庫。是對不一樣於傳統的關係型數據庫的數據庫管理系統的統稱。mysql

爲何使用NoSQL ?

對於一些須要靈活結構的數據,關係型數據庫的橫向擴展能力不夠,而 NoSQL 存儲數據不須要固定的模式,無需多餘操做就能夠橫向擴展。redis

RDBMS vs NoSQL

RDBMSsql

  • 高度組織化結構化數據
  • 結構化查詢語言(SQL)
  • 數據和關係都存儲在單獨的表中。
  • 數據操縱語言,數據定義語言
  • 嚴格的一致性
  • 基礎事務

NoSQLmongodb

  • 表明着不只僅是SQL
  • 沒有聲明性查詢語言
  • 沒有預約義的模式
  • 鍵值對存儲,列存儲,文檔存儲,圖形數據庫
  • 最終一致性,而非ACID屬性
  • 非結構化和不可預知的數據
  • CAP定理
  • 高性能,高可用性和可伸縮性

ACID規則(關係型數據庫)

事務在英文中是transaction,和現實世界中的交易很相似,它有以下四個特性:數據庫

一、A (Atomicity) 原子性segmentfault

原子性很容易理解,也就是說事務裏的全部操做要麼所有作完,要麼都不作,事務成功的條件是事務裏的全部操做都成功,只要有一個操做失敗,整個事務就失敗,須要回滾。服務器

好比銀行轉帳,從A帳戶轉100元至B帳戶,分爲兩個步驟:1)從A帳戶取100元;2)存入100元至B帳戶。這兩步要麼一塊兒完成,要麼一塊兒不完成,若是隻完成第一步,第二步失敗,錢會莫名其妙少了100元。微信

二、C (Consistency) 一致性

一致性也比較容易理解,也就是說數據庫要一直處於一致的狀態,事務的運行不會改變數據庫本來的一致性約束。

例如現有完整性約束a+b=10,若是一個事務改變了a,那麼必須得改變b,使得事務結束後依然知足a+b=10,不然事務失敗。

三、I (Isolation) 獨立性

所謂的獨立性是指併發的事務之間不會互相影響,若是一個事務要訪問的數據正在被另一個事務修改,只要另一個事務未提交,它所訪問的數據就不受未提交事務的影響。

好比如今有個交易是從A帳戶轉100元至B帳戶,在這個交易還未完成的狀況下,若是此時B查詢本身的帳戶,是看不到新增長的100元的。

四、D (Durability) 持久性

持久性是指一旦事務提交後,它所作的修改將會永久的保存在數據庫上,即便出現宕機也不會丟失。

CAP定理(CAP theorem)

在計算機科學中, CAP定理(CAP theorem), 又被稱做 布魯爾定理(Brewer's theorem), 它指出對於一個分佈式計算系統來講,不可能同時知足如下三點:

  • 一致性(Consistency) (全部節點在同一時間具備相同的數據)
  • 可用性(Availability) (保證每一個請求無論成功或者失敗都有響應)
  • 分隔容忍(Partition tolerance) (系統中任意信息的丟失或失敗不會影響系統的繼續運做)

CAP理論的核心是:一個分佈式系統不可能同時很好的知足一致性,可用性和分區容錯性這三個需求,最多隻能同時較好的知足兩個。

所以,根據 CAP 原理將 NoSQL 數據庫分紅了知足 CA 原則、知足 CP 原則和知足 AP 原則三 大類:

  • CA - 單點集羣,知足一致性,可用性的系統,一般在可擴展性上不太強大。
  • CP - 知足一致性,分區容忍性的系統,一般性能不是特別高。
  • AP - 知足可用性,分區容忍性的系統,一般可能對一致性要求低一些。

image.png

Redis

Redis 是一個開源的使用 ANSI C 語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。目前由VMware主持開發工做。

Redis 一般被稱爲數據結構服務器,由於值(value)能夠是 字符串(String), 哈希(Hash/Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)五種類型,操做很是方便。好比,若是你在作好友系統,查看本身的好友關係,若是採用其餘的key-value系統,則必須把對應的好友拼接成字符串,而後在提取好友時,再把value進行解析,而redis則相對簡單,直接支持list的存儲(採用雙向鏈表或者壓縮鏈表的存儲方式)。

var redis = require("redis"),
    client = redis.createClient();
client.on("error", function (err) {
    console.log("Error " + err);
});

client.set("string key", "string val", redis.print);
client.hset("hash key", "hashtest 1", "some value", redis.print);
client.hset(["hash key", "hashtest 2", "some other value"], redis.print);
client.hkeys("hash key", function (err, replies) {
    console.log(replies.length + " replies:");
    replies.forEach(function (reply, i) {
        console.log("    " + i + ": " + reply);
    });
    client.quit();
});

屬於CP類型

MongoDB

MongoDB 是一個高性能,開源,無模式的文檔型數據庫,開發語言是C++。它在許多場景下可用於替代傳統的關係型數據庫或鍵/值存儲方式。

在 MongoDB 中,文檔是對數據的抽象,它的表現形式就是咱們常說的 BSON_(Binary JSON )_。

BSON 是一個輕量級的二進制數據格式。MongoDB 可以使用 BSON,並將 BSON 做爲數據的存儲存放在磁盤中。

BSON 是爲效率而設計的,它只須要使用不多的空間,同時其編碼和解碼都是很是快速的。即便在最壞的狀況下,BSON格式也比JSON格式再最好的狀況下存儲效率高。

對於前端開發者來講,一個「文檔」就至關於一個對象。

var mongodb = require('mongodb');

var mongodbServer = new mongodb.Server('localhost', 27017, { auto_reconnect: true, poolSize: 10 });
var db = new mongodb.Db('mydb', mongodbServer);

/* open db */
db.open(function() {
    /* Select 'contact' collection */
    db.collection('contact', function(err, collection) {
        /* Insert a data */
        collection.insert({
            name: 'Fred Chien',
            email: 'cfsghost@gmail.com',
            tel: [
                '0926xxx5xx',
                '0912xx11xx'
            ]
        }, function(err, data) {
            if (data) {
                console.log('Successfully Insert');
            } else {
                console.log('Failed to Insert');
            }
        });

        /* Querying */
        collection.find({ name: 'Fred Chien' }, function(err, data) {
            /* Found this People */
            if (data) {
                console.log('Name: ' + data.name + ', email: ' + data.email);
            } else {
                console.log('Cannot found');
            }
        });
    });
});

MongoDB 比較靈活,能夠設置成 strong consistent _(CP類型)_或者 eventual consistent_(AP類型)_。

但其默認是 CP 類型

微信公衆號:前端linong

clipboard.png

參考文獻

  1. 前端培訓目錄、前端培訓規劃、前端培訓計劃
  2. https://www.runoob.com/mongodb/nosql.html
  3. http://www.javashuo.com/article/p-hcthhmus-hr.html
相關文章
相關標籤/搜索