Table of Contents
關聯式資料庫是一種型別的資料庫,其儲存並提供存取被彼此相關的資料點。關聯式資料庫基於關係模型,這是一種在表中表示資料的直觀,直接的方法。在關聯式資料庫中,表中的每一行都是一條記錄,該記錄具有唯一的ID(稱為key)。該表的列儲存資料的屬性,每個記錄通常為每個屬性都有一個值,這使得在資料點之間建立關係變得容易。
現在我們已經瞭解了NoSQL資料庫,讓我們將它們與傳統上最流行的資料庫進行對比:SQL(結構化查詢語言)存取的關聯式資料庫。與關聯式資料庫互動時可以使用SQL,在關聯式資料庫中資料儲存在具有固定列和行的表中。
SQL資料庫在1970年代初開始流行。當時,儲存非常昂貴,因此軟體工程師對他們的資料庫進行規範化以減少資料重複。
1970年代的軟體工程師通常也遵循瀑布式軟體開發模型。在開始開發之前,詳細計劃了專案。軟體工程師精心建立複雜的實體關係(ER)圖,以確保他們仔細考慮了需要儲存的所有資料。由於採用了這種預先計劃模型,如果在開發週期中需求發生變化,軟體工程師就難以適應。結果,專案經常超出預算,超過了截止日期,無法滿足使用者需求。 -- https://www.mongodb.com/nosql-explained
關係模型意味著邏輯資料結構(資料表,檢視和索引)與物理儲存結構是分開的。這種分離意味著資料庫管理員可以管理物理資料儲存,而不會影響對作為邏輯結構的資料的存取。例如,重新命名資料庫檔案不會重新命名儲存在其中的表。
邏輯操作和物理操作之間的區別也適用於資料庫操作,這是明確定義的操作,使應用程式能夠操縱資料庫的資料和結構。邏輯操作允許應用程式指定其所需的內容,而物理操作則確定應如何存取該資料然後執行任務。
為了確保資料始終準確且可存取,關聯式資料庫遵循某些完整性規則。例如,完整性規則可以指定不允許在表中重複行,以消除潛在的錯誤資訊進入資料庫的可能性。
在資料庫的早期,每個應用程式都以自己獨特的結構儲存資料。當開發人員想要構建使用該資料的應用程式時,他們必須對特定的資料結構瞭解很多,才能找到所需的資料。這些資料結構效率低下,難以維護且難以優化以提供良好的應用程式效能。設計關聯式資料庫模型是為了解決多個任意資料結構的問題。
關係模型提供了表示和查詢可被任何應用程式使用的資料的標準方式。從一開始,開發人員就認識到關聯式資料庫模型的主要優勢在於表的使用,這是一種儲存,存取結構化資訊的直觀,有效且靈活的方式。
隨著時間的流逝,隨著開發人員開始使用結構化查詢語言(SQL)在資料庫中寫入和查詢資料,關係模型的另一優勢出現了。多年來,SQL已被廣泛用作資料庫查詢的語言。SQL基於關係代數,提供了一種內部一致的數學語言,可以更輕鬆地提高所有資料庫查詢的效能。相比之下,其他方法必須定義單個查詢。
所有型別和規模的組織都使用簡單而強大的關係模型來滿足各種資訊需求。關聯式資料庫用於跟蹤庫存,處理電子商務交易,管理大量關鍵任務客戶資訊等等。可以考慮將關聯式資料庫用於資料點彼此相關的任何資訊需求,並且必須以安全,基於規則的一致方式進行管理。
關聯式資料庫自1970年代就已經存在。如今,關係模型的優勢繼續使其成為資料庫中最廣泛接受的模型。
關係模型最適合維護應用程式和資料庫副本(稱為範例)之間的資料一致性。例如,當客戶在ATM機上存錢,然後檢視手機上的帳戶餘額時,客戶希望看到該筆存款會立即反映在更新的帳戶餘額中。關聯式資料庫在這種資料一致性方面表現出色,可確保資料庫的多個範例始終具有相同的資料。
對於其他型別的資料庫,很難與大量資料保持這種及時的一致性。最近的某些資料庫(例如NoSQL)只能提供「最終一致性」。根據此原理,在擴充套件資料庫或多個使用者同時存取同一資料時,資料需要一些時間來「追趕」。最終的一致性對於某些用途是可以接受的,例如在產品目錄中維護列表,但是對於關鍵業務操作(例如購物車交易),關聯式資料庫仍然是黃金標準。
關聯式資料庫在非常細粒度的級別上處理業務規則和策略,並具有關於隔離的嚴格策略(即,永久更改資料庫)。例如,考慮一個庫存資料庫,該資料庫跟蹤始終一起使用的三個部分。從庫存中拉出一個零件時,還必須拉出另外兩個。如果這三個部分之一不可用,則不應該拉扯任何一個部分-資料庫作出任何隔離之前,所有三個部分都必須可用。關聯式資料庫在知道可以對所有三個資料庫都提交之前,不會提交一部分。這種多方面的隔離能力稱為原子性。原子性是確保資料庫中資料準確並確保其符合業務規則,法規和政策的關鍵。
定義關聯式資料庫事務的四個關鍵屬性是:原子性,一致性,隔離性和永續性(通常稱為ACID)。
資料存取涉及許多重複操作。例如,從資料表中獲取資訊的簡單查詢可能需要重複數百或數千次才能產生所需的結果。這些資料存取功能需要某種型別的程式碼才能存取資料庫。應用程式開發人員不想在每個新應用程式中為這些功能編寫新程式碼。幸運的是,關聯式資料庫允許儲存過程,這是可以通過簡單的應用程式呼叫存取的程式碼塊。例如,單個儲存過程可以為多個應用程式的使用者提供一致的記錄標記。儲存過程還可以幫助開發人員確保以特定方式實現應用程式中的某些資料功能。
當多個使用者或應用程式試圖同時更改同一資料時,資料庫中可能會發生衝突。鎖定和並行技術可在保持資料完整性的同時減少發生衝突的可能性。
鎖定可防止其他使用者和應用程式在更新資料時存取資料。在某些資料庫中,鎖定適用於整個表,這會對應用程式效能產生負面影響。其他資料庫(例如Oracle關聯式資料庫)在記錄級別應用鎖,使表中的其他記錄可用,從而有助於確保更好的應用程式效能。
當多個使用者或應用程式同時在同一資料庫上呼叫查詢時,並行管理活動。根據為資料控制定義的策略,此功能提供了對使用者和應用程式的正確存取。
用於儲存,管理,查詢和檢索關聯式資料庫中儲存的資料的軟體稱為關聯式資料庫管理系統(RDBMSf)(《RDBMS即關聯式資料庫管理系統(Relational Database Management System)》)。RDBMS提供使用者與應用程式和資料庫之間的介面,以及用於管理資料儲存,存取和效能的管理功能。
在資料庫型別和關聯式資料庫產品之間進行選擇時,有幾個因素可以指導您做出決定。您選擇的RDBMS將取決於您的業務需求。問問自己以下問題:
多年來,關聯式資料庫已經變得越來越好,越來越快,越來越強大並且更易於使用。但是它們也變得更加複雜,並且管理資料庫長期以來一直是一項全職工作。開發人員必須將大部分時間花在優化資料庫效能所需的管理活動上,而不是將他們的專業知識用於開發可為業務帶來價值的創新應用程式。
如今,自主技術正在利用關係模型的優勢來提供新型的關聯式資料庫。該資料庫(又稱獨立資料庫)維護權力和關係模型的優點,但採用人工智慧(AI),機器學習和自動化監控和提高查詢效能和管理任務。例如,為了提高查詢效能,自動駕駛資料庫可以對索引進行假設和測試,以加快查詢速度,然後將最佳查詢推入生產環境(全部依靠自己)。自動駕駛資料庫無需人工干預即可連續進行這些改進。
自主技術使開發人員擺脫了管理資料庫的繁瑣任務。例如,他們不再需要預先確定基礎架構要求。相反,使用自動駕駛資料庫,他們可以根據需要新增儲存和計算資源以支援資料庫增長。僅需幾個步驟,開發人員就可以輕鬆建立自治的關聯式資料庫,從而加快了應用程式開發的時間。
Nosql的全稱是Not Only Sql,這個概念早起就有人提出,在09年的時候比較火。Nosql指的是非關係型資料庫,而我們常用的都是關係型資料庫。就像我們常用的mysql,sqlserver一樣,這些資料庫一般用來儲存重要資訊,應對普通的業務是沒有問題的。但是,隨著網際網路的高速發展,傳統的關係型資料庫在應付超大規模,超大流量以及高並行的時候力不從心。而就在這個時候,Nosql得到的告訴的發展。
人們使用「 NoSQL資料庫」一詞時,通常會使用它來指代任何非關聯式資料庫。有人說「 NoSQL」代表「非SQL」,而另一些人則說「不僅SQL」。無論哪種方式,大多數人都認為NoSQL資料庫是以關係表以外的格式儲存資料的資料庫。
一個常見的誤解是NoSQL資料庫或非關聯式資料庫不能很好地儲存關係資料。NoSQL資料庫可以儲存關係資料-它們與關聯式資料庫的儲存方式不同。實際上,與SQL資料庫相比,許多人發現NoSQL資料庫中的建模關係資料比SQL資料庫中的建模關係資料更容易,因為不必在表之間拆分相關資料。
NoSQL資料模型允許將相關資料巢狀在單個資料結構中。
隨著儲存成本的急劇下降,NoSQL資料庫出現在2000年代後期。僅出於減少資料重複的目的而建立複雜,難以管理的資料模型的日子已經一去不復返了。開發人員(而非儲存人員)已成為軟體開發的主要成本,因此NoSQL資料庫針對開發人員的生產力進行了優化。 -- https://www.mongodb.com/nosql-explained
隨著儲存成本迅速降低,儲存和查詢所需的資料應用程式數量也增加了。這些資料具有各種形狀和大小(結構化,半結構化和多型性),因此預先定義架構幾乎變得不可能。NoSQL資料庫允許開發人員儲存大量非結構化資料,從而為他們提供了很大的靈活性。
此外,敏捷越來越受歡迎,軟體工程師也在重新考慮他們開發軟體的方式。他們認識到需要快速適應不斷變化的需求。他們需要能夠快速迭代並在整個軟體堆疊中進行更改(一直到資料庫模型)的能力。NoSQL資料庫為他們提供了這種靈活性。
雲端計算也越來越流行,開發人員開始使用公共雲來託管其應用程式和資料。他們希望能夠在多個伺服器和區域之間分佈資料,以使其應用程式具有彈性,可以橫向擴充套件而不是縱向擴充套件以及對資料進行智慧地理定位。一些NoSQL資料庫(如MongoDB)提供了這些功能。
https://www.mongodb.com/nosql-explained
隨著時間的流逝,出現了四種主要的NoSQL資料庫型別: 檔案資料庫,鍵值資料庫,寬列儲存和圖形資料庫。讓我們檢查每種型別。
https://www.mongodb.com/nosql-explained
從設計角度理解NoSQL資料庫的吸引力的一種方法是,在使用地址資料的過於簡化的範例中,檢視SQL和NoSQL資料庫的資料模型的外觀。
SQL案例。 對於SQL資料庫,從地址的邏輯結構開始建立用於地址的資料庫,並且期望要儲存的記錄將保持相對不變。在分析了預期的查詢模式之後,SQL資料庫可能會優化兩個表中的儲存,一個用於基本資訊,另一個用於成為客戶,姓氏是兩個表的鍵。每個表中的每一行都是一個客戶,每列具有以下固定屬性:
NoSQL案例。在上面的NoSQL資料庫型別一節中,描述了四種型別,每種都有自己的資料模型。
每種NoSQL資料庫的設計都應考慮到特定的客戶情況,並且會因技術原因而組織每種型別的資料庫。描述最簡單的型別是檔案資料庫,在其中將基本資訊和客戶資訊都組合在一個JSON檔案中是很自然的。在這種情況下,每個SQL列屬性將是欄位,而客戶記錄的詳細資訊將是與每個欄位關聯的資料值。
例如:Last_name: "Jones", First_name: "Mary", Middle_initial: "S",等等
嘗試NoSQL資料庫
如果您想嘗試NoSQL資料庫,MongoDB Atlas是一個不錯的起點。Atlas是由MongoDB完全管理的資料庫服務,並且在所有領先的雲提供商中都可用。阿特拉斯(Atlas)有一個永久的層,您可以用來踢輪胎並瞭解基礎知識。當您準備超越免費套餐時,可以使用程式碼NOSQLEXPLAINED獲得200美元的Atlas積分。
不確定擁有Atlas帳戶後該怎麼辦?前往MongoDB大學,您可以從MongoDB工程師那裡獲得免費的線上培訓。MongoDB大學的課程註冊已超過140萬。該快速入門教學是另一個偉大的地方開始,因為他們會幫助你起床,並與喜愛的程式語言快速執行。
關係型資料庫是表格式的,因此儲存在表的行和列中。他們之間很容易關聯共同作業儲存,提取資料很方便。而Nosql資料庫則與其相反,他是大塊的組合在一起。通常儲存在資料集中,就像檔案、鍵值對或者圖結構。
關係型資料庫對應的是結構化資料,資料表都預先定義了結構(列的定義),結構描述了資料的形式和內容。這一點對資料建模至關重要,雖然預定義結構帶來了可靠性和穩定性,但是修改這些資料比較困難。而Nosql資料庫基於動態結構,使用與非結構化資料。因為Nosql資料庫是動態結構,可以很容易適應資料型別和結構的變化。
關係型資料庫的資料儲存為了更高的規範性,把資料分割為最小的關係表以避免重複,獲得精簡的空間利用。雖然管理起來很清晰,但是單個操作設計到多張表的時候,資料管理就顯得有點麻煩。而Nosql資料儲存在平面資料集中,資料經常可能會重複。單個資料庫很少被分隔開,而是儲存成了一個整體,這樣整塊資料更加便於讀寫
這可能是兩者之間最大的區別,關係型資料庫是縱向擴充套件,也就是說想要提高處理能力,要使用速度更快的計算機。因為資料儲存在關係表中,操作的效能瓶頸可能涉及到多個表,需要通過提升計算機效能來克服。雖然有很大的擴充套件空間,但是最終會達到縱向擴充套件的上限。而Nosql資料庫是橫向擴充套件的,它的儲存天然就是分散式的,可以通過給資源池新增更多的普通資料庫伺服器來分擔負載。
橫向擴充套件是已擴充套件伺服器的數量進行高並行的處理(增強處理業務的能力)
根據設定nginx的反向代理,轉發伺服器(設定的ip)進行輪換處理業務(可加入負載均衡器進行分發請求)
縱向擴充套件,是增加單機的處理能力,一般增加cpu的處理能力
關係型資料庫通過結構化查詢語言來運算元據庫(就是我們通常說的SQL)。SQL支援資料庫CURD操作的功能非常強大,是業界的標準用法。而Nosql查詢以塊為單元運算元據,使用的是非結構化查詢語言(UnQl),它是沒有標準的。關係型資料庫表中主鍵的概念對應Nosql中儲存檔案的ID。關係型資料庫使用預定義優化方式(比如索引)來加快查詢操作,而Nosql更簡單更精確的資料存取模式。
關係型資料庫遵循ACID規則(原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、永續性(Durability)),而Nosql資料庫遵循BASE原則(基本可用(Basically Availble)、軟/柔性事務(Soft-state )、最終一致性(Eventual Consistency))。由於關係型資料庫的資料強一致性,所以對事務的支援很好。關係型資料庫支援對事務原子性細粒度控制,並且易於回滾事務。而Nosql資料庫是在CAP(一致性、可用性、分割區容忍度)中任選兩項,因為基於節點的分散式系統中,很難全部滿足,所以對事務的支援不是很好,雖然也可以使用事務,但是並不是Nosql的閃光點。
關係型資料庫為了維護資料的一致性付出了巨大的代價,讀寫效能比較差。在面對高並行讀寫效能非常差,面對海量資料的時候效率非常低。而Nosql儲存的格式都是key-value型別的,並且儲存在記憶體中,非常容易儲存,而且對於資料的 一致性是 弱要求。Nosql無需sql的解析,提高了讀寫效能。
關係型資料庫通常有SQL Server,Mysql,Oracle。主流的Nosql資料庫有redis,memcache,MongoDb。大多數的關係型資料庫都是付費的並且價格昂貴,成本較大,而Nosql資料庫通常都是開源的。
柔性事務滿足Base理論(基本可用、最終一致性)、CAP理論。
剛性事務滿足ACID理論。
原子性是指事務是一個不可再分割的工作單元,事務中的操作要麼都發生,要麼都不發生。可採用「A向B轉賬」這個例子來說明解釋。在DBMS中,預設情況下一條SQL就是一個單獨事務,事務是自動提交的。只有顯式的使用start transaction開啟一個事務,才能將一個程式碼塊放在事務中執行。
一致性是指在事務開始之前和事務結束以後,資料庫的完整性約束沒有被破壞。這是說資料庫事務不能破壞關係資料的完整性以及業務邏輯上的一致性。
如A給B轉賬,不論轉賬的事務操作是否成功,其兩者的存款總額不變(這是業務邏輯的一致性,至於資料庫關係約束的完整性就更好理解了)。
保障機制(也從兩方面著手):資料庫層面會在一個事務執行之前和之後,資料會符合你設定的約束(唯一約束,外來鍵約束,check約束等)和觸發器設定;此外,資料庫的內部資料結構(如 B 樹索引或雙向連結串列)都必須是正確的。業務的一致性一般由開發人員進行保證,亦可轉移至資料庫層面。
多個事務並行存取時,事務之間是隔離的,一個事務不應該影響其它事務執行效果。
在並行環境中,當不同的事務同時操縱相同的資料時,每個事務都有各自的完整資料空間。由並行事務所做的修改必須與任何其他並行事務所做的修改隔離。事務檢視資料更新時,資料所處的狀態要麼是另一事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會檢視到中間狀態的資料。
事務最複雜問題都是由事務隔離性引起的。完全的隔離性是不現實的,完全的隔離性要求資料庫同一時間只執行一條事務,這樣會嚴重影響效能。
關於隔離性中的事務隔離等級(事務之間影響),參見相應博文
這是最好理解的一個特性:永續性,意味著在事務完成以後,該事務所對資料庫所作的更改便持久的儲存在資料庫之中,並不會被回滾。(完成的事務是系統永久的部分,對系統的影響是永久性的,該修改即使出現致命的系統故障也將一直保持)
write ahead logging:SQL Server中使用了WAL(Write-Ahead Logging)技術來保證事務紀錄檔的ACID特性,在資料寫入到資料庫之前,先寫入到紀錄檔,再將紀錄檔記錄變更到記憶體中。
Redis 是完全開源免費的,遵守BSD協定,是一個高效能的key-value資料庫。
Redis 與其他 key - value 快取產品有以下三個特點:
《Redis架構概述》https://rtoax.blog.csdn.net/article/details/107917429
《Redis與Memcached的對比》https://rtoax.blog.csdn.net/article/details/108614104
《Redis與MySQL的雙劍合璧,一文讀懂redis》https://rtoax.blog.csdn.net/article/details/108614373
《Redis快取持久化:RDB持久化和AOF持久化》https://rtoax.blog.csdn.net/article/details/108729843
《Redis:使用Redis的分散式鎖》https://rtoax.blog.csdn.net/article/details/108657676