淺談數據庫

內容轉載自我本身的博客redis

@(文章目錄)算法

數據庫介紹

數據庫(Database)指的是以必定方式儲存在一塊兒、能爲多個用戶共享、具備儘量小的冗餘度、與應用程序彼此獨立的數據集合。這種數據集合具備以下特色:儘量不重複,以最優方式爲某個特定組織的多種應用服務,其數據結構獨立於使用它的應用程序,對數據的增、刪、改、查由統一軟件進行管理和控制。隨着計算機在數據管理領域的廣泛應用,人們對數據管理技術提出了更高的要求:但願面向企業或部門,以數據爲中心組織數據,減小數據的冗餘,提供更高的數據共享能力,同時要求程序和數據具備較高的獨立性,當數據的邏輯結構改變時,不涉及數據的物理結構,也不影響應用程序,以下降應用程序研製與維護的費用sql

數據庫管理

數據庫管理系統(Database Management System)是爲管理數據庫而設計的電腦軟件系統,通常具備存儲、截取、安全保障、備份等基礎功能mongodb

物理結構

數據庫的基本結構分三個層次,反映了觀察數據庫的三種不一樣角度,不一樣層次之間的聯繫是經過映射進行轉換的數據庫

物理數據層

數據庫的最內層,是物理存貯設備上實際存儲的數據的集合。這些數據是原始數據,是用戶加工的對象,由內部模式描述的指令操做處理的位串、字符和字組成編程

概念數據層

數據庫的中間一層,是數據庫的總體邏輯表示。指出了每一個數據的邏輯定義及數據間的邏輯聯繫,是存貯記錄的集合。它所涉及的是數據庫全部對象的邏輯關係,而不是它們的物理狀況,是數據庫管理員概念下的數據庫後端

用戶數據層

用戶所看到和使用的數據庫,表示了一個或一些特定用戶使用的數據集合,即邏輯記錄的集合數組

邏輯分類

數據庫的邏輯結構一般分爲層次數據庫、網絡數據庫和關係數據庫三種,不一樣的數據庫是按不一樣的數據結構來聯繫和組織的緩存

關係數據庫

關係數據庫(Relational database)是建立在關係模型基礎上的數據庫。它藉助於集合代數等數學概念和方法來處理數據庫中的數據。它的模型是把複雜的數據結構歸結爲簡單的二元關係(即二維表格形式)。在關係數據庫中,對數據的操做幾乎所有創建在一個或多個關係表格上,經過對這些關聯的表格分類、合併、鏈接或選取等運算來實現數據庫的管理

數據庫表

在關係數據庫中,表[關係](Relation)是以列[屬性](Attribute)和行[值組](Tuple)的形式組織起來的數據的集合。關係數據庫模型
一個數據庫包括一個或多個表,數據庫表是一系列二維數組的集合。例如,下面是一個包含id、年齡、性別、國家的學生信息表:

學生信息表

ID 姓名 性別 年齡 國家
0 KangKang 18 中國
1 Maria 17 古巴
2 Michael 19 美國
3 Jane 16 英國

Oracle

Oracle[ˈɒrəkl]數據庫(Oracle Database),又名Oracle Oracle Logo
Oracle由至少一個表空間數據庫模式對象組成。模式是對象的集合,而模式對象是直接引用數據庫數據的邏輯結構。模式對象包括這樣一些結構:表、視圖、序列、存儲過程、同義詞、索引、簇和數據庫鏈等。邏輯存儲結構包括表空間、段和範圍,用於描述怎樣使用數據庫的物理空間。
段(Segment)是表空間中一個指定類型的邏輯存儲結構,它由一個或多個範圍組成,段將佔用並增加存儲空間

  • 數據段:用來存放表數據
  • 索引段:用來存放表索引
  • 臨時段:用來存放中間結果
  • 回滾段:用於出現異常時,恢復事務

範圍(Extent)是數據庫存儲空間分配的邏輯單位,一個範圍由許多連續的數據塊組成,範圍是由段依次分配的,分配的第一個範圍稱爲初始範圍,之後分配的範圍稱爲增量範圍

MySQL

MySQL[maɪˌɛskjuːˈɛl](My Structure Quest Language)本來是一個開放源代碼的關係數據庫管理系統,使用C和C++編寫,後被甲骨文公司(Oracle)收購,成爲Oracle旗下產品。MySQL在過去因爲性能高、成本低、可靠性好,已經成爲最流行的開源數據庫,所以被普遍地應用在Internet上的中小型網站中。LAMP架構
隨着MySQL的不斷成熟,它也逐漸用於更大規模的網站和應用,好比維基百科(維基百科已於2013年正式宣佈將從MySQL遷移到MariaDB數據庫)、Google和Facebook等網站,很是流行的開源軟件組合LAMP(Linux-Apache-MySQL-PHP)中的「M」指的就是MySQL
索引是一種特殊的文件,它們包含着對數據表裏全部記錄的引用指針。索引不是萬能的,它能夠加快數據檢索操做,但會使數據修改操做變慢。每修改數據記錄,索引就必須刷新一次。爲了在某種程度上彌補這一缺陷,許多SQL命令都有一個DELAY_KEY_WRITE項。這個選項的做用是暫時制止 MySQL在該命令每插入一條新記錄和每修改一條現有以後馬上對索引進行刷新,對索引的刷新將等到所有記錄插入/修改完畢以後再進行。在須要把許多新記錄插入某個數據表的場合DELAY_KEY_WRITE選項的做用將很是明顯。另外,索引還會在硬盤上佔用至關大的空間。所以應該只爲最常常查詢和最常常排序的數據列創建索引。注意,若是某個數據列包含許多重複的內容,爲它創建索引就沒有太大的實際效果。從理論上講,徹底能夠爲數據表裏的每一個字段分別建一個索引,但MySQL把同一個數據表裏的索引總數限制爲16個

MariaDB

MariaDB(名稱來自Michael Widenius的女兒Maria的名字)數據庫管理系統是MySQL的一個分支,主要由開源社區在維護,採用GPL受權許可。MariaDB Logo
開發這個分支的緣由之一是:甲骨文公司收購了MySQL後,有將MySQL閉源的潛在風險,所以社區採用分支的方式來避開這個風險
MariaDB基於事務的Maria存儲引擎,替換了MySQL的MyISAM存儲引擎,它使用了Percona的 XtraDB,InnoDB的變體

SQL Server

Microsoft SQL Server是由美國微軟公司所推出的關係數據庫解決方案,數據庫的內置語言本來是採用美國標準局(ANSI)和國際標準組織(ISO)所定義的SQL語言。SQL Server Logo
SQL Server一開始並非微軟本身研發的產品,而是當時爲了要和IBM競爭時,與Sybase合做所產生的,其最先的發展者是Sybase,與Sybase終止合做關係後,SQL Server版本均由微軟自行研發

Access

Microsoft Office Access[[ˈækses]是是微軟把數據庫引擎的圖形用戶界面和軟件開發工具結合在一塊兒的一個關係數據庫管理系統。Access可以訪問Access/Jet、Microsoft SQL Server、Oracle數據庫,或者任何ODBC(Open Database Connectivity)兼容數據庫內的數據。雖然它支持部分面向對象技術,可是未能成爲一種完整的面向對象開發工具。
它擁有的報表建立功能可以處理任何它可以訪問的數據源。Access提供功能參數化的查詢,這些查詢和Access表格能夠被諸如VB6和.NET的其它程序經過DAO或ADO訪問;它的數據文件不能突破2G的限制,它的結構化查詢語言(JET SQL)能力有限,不適合大型數據庫處理應用

鍵值存儲數據庫

Key-Value存儲,簡稱KV存儲。它是NoSQL存儲的一種方式。它的數據按照鍵值對的形式進行組織,索引和存儲。KV存儲很是適合不涉及過多數據關係業務關係的業務數據,同時能有效減小讀寫磁盤的次數,比SQL數據庫存儲擁有更好的讀寫性能

Redis

Redis是一個使用ANSI C編寫的開源、支持網絡、基於內存、可選持久性的鍵值對存儲數據庫。Redis的外圍由一個鍵、值映射的字典構成。與其餘非關係數據庫主要不一樣在於:Redis中值的類型不只限於字符串,還支持抽象數據類型:字符串列表無序不重複的字符串集合有序不重複的字符串集合鍵、值都爲字符串的哈希表。值的類型決定了值自己支持的操做。Redis支持不一樣無序、有序的列表,無序、有序的集合間的交集、並集等高級服務器端原子操做。Redis會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了master-slave(主從)同步。數據能夠從主服務器向任意數量的從服務器上同步,從服務器能夠是關聯其餘從服務器的主服務器。這使得Redis可執行單層樹複製。存盤能夠有意無心的對數據進行寫操做。因爲徹底實現了發佈/訂閱機制,使得從數據庫在任何地方同步樹時,可訂閱一個頻道並接收主服務器完整的消息發佈記錄。同步對讀取操做的可擴展性和數據冗餘頗有幫助

Memcached

Memcached是一個高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它經過在內存中緩存數據和對象來減小讀取數據庫的次數,從而提升動態、數據庫驅動網站的速度。是Danga Interactive爲了LiveJournal所發展的,但被許多軟件(如MediaWiki)所使用。這是一套開放源代碼軟件,以BSD license受權協議發佈。Memcached的API使用三十二比特的循環冗餘校驗(CRC-32)計算鍵值後,將數據分散在不一樣的機器上。當表格滿了之後,接下來新增的數據會以LRU機制替換掉。因爲Memcached一般只是看成緩存系統使用,因此使用Memcached的應用程序在寫回較慢的系統時(像是後端的數據庫)須要額外的代碼更新M
emcached內的數據

文檔存儲數據庫

面向文檔的數據庫(Document-oriented DataBase)是一種被設計用於儲存、檢索和管理文檔導向信息(也稱爲「半結構化數據」)的計算機程序。文檔導向的數據庫是NoSQL數據庫的一個主要類別,文檔導向的數據庫的普及程度已經隨着NoSQL自己被不斷使用而有所增加。XML數據庫是針對XML文件作了優化的文檔導向的數據庫的子類。文檔存儲支持對結構化數據的訪問,不一樣於關係模型的是,文檔存儲沒有強制的架構。事實上,文檔存儲以封包鍵值對的方式進行存儲。在這種狀況下,應用對要檢索的封包採起一些約定,或者利用存儲引擎的能力將不一樣的文檔劃分紅不一樣的集合,以管理數據。與關係模型不一樣的是,文檔存儲模型支持嵌套結構;與鍵值存儲不一樣的是,文檔存儲關心文檔的內部結構

MongoDB

MongoDB是一個基於分佈式文件存儲的數據庫,由C++語言編寫,旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。它是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。他支持的數據結構很是鬆散,是相似JSON(JavaScript Object Notation)的BSON(Binary Serialized Document Format)格式,所以能夠存儲比較複雜的數據類型。Mongo最大的特色是他支持的查詢語言很是強大,其語法有點相似於面向對象的查詢語言,幾乎能夠實現相似關係數據庫單表查詢的絕大部分功能,並且還支持對數據創建索引。它使用內存映射文件, 32位系統上限制大小爲2GB的數據(64位支持更大的數據)

CouchDB

Apache CouchDB(Cluster Of Unreliable Commodity Hardware DataBase)是一個開源的面向文檔的數據庫管理系統,它是一個使用JSON做爲存儲格式,JavaScript做爲查詢語言,MapReduce和HTTP做爲API的NoSQL數據庫。不一樣於關係型數據庫,CouchDB沒有將數據和關係存儲在表格裏。替代的,一個應用程序可能會訪問多個數據庫,每一個數據庫是一個獨立的文檔集合,每個文檔維護其本身獨立的數據和自包涵的schema。CouchDB實現了一個多版本併發控制(MVCC)形式,用來避免在數據庫寫操做的時候對文件進行加鎖,衝突留給應用程序去解決。解決一個衝突的通用操做的是首先合併數據到其中一個文檔,而後刪除舊的數據

列存儲數據庫

列式數據庫是以列相關存儲架構進行數據存儲的數據庫,主要適合於批量數據處理和即時查詢;與之對應的是行式數據庫,數據以行相關的存儲體系架構進行空間分配,主要適合於小批量的數據處理,經常使用於聯機事務型數據處理
數據庫以行、列的二維表的形式存儲數據,可是卻以一維字符串的方式存儲。列式數據庫把一列中的數據值串在一塊兒存儲起來,而後再存儲下一列的數據;行式數據庫把一行中的數據值串在一塊兒存儲起來,而後再存儲下一行的數據

HBase

Apache HBase最初是Powerset公司爲了處理天然語言搜索產生的海量數據而開展的項目。不過如今它已是Apache基金會的頂級項目,它是一個開源的非關係型分佈式數據庫(NoSQL),參考了谷歌的BigTable建模,實現的編程語言爲 Java,運行於HDFS文件系統之上,爲 Hadoop 提供相似於BigTable 規模的服務。所以,它能夠容錯地存儲海量稀疏的數據。它在列上實現了BigTable論文提到的壓縮算法、內存操做和布隆過濾器。HBase的表可以做爲MapReduce任務的輸入和輸出,能夠經過Java API來訪問數據,也能夠經過REST、Avro或者Thrift的API來訪問

Cassandra

Apache Cassandra(社區內通常簡稱爲C*)是一套開源分佈式NoSQL數據庫系統。它最初由Facebook開發,用於儲存收件箱等簡單格式數據,是一種流行的分佈式結構化數據存儲方案。它的數據並不存儲在分佈式文件系統如GFS或HDFS中,而是直接存於本地
使用了Google 設計的 BigTable的數據模型,與面向行(row)的傳統的關係型數據庫或鍵值存儲的key-value數據庫不一樣,Cassandra使用的是寬列存儲模型(Wide Column Stores),每行數據由row key惟一標識以後,能夠有最多20億個列,每一個列由一個column key標識,每一個column key下對應若干value。這種模型能夠理解爲是一個二維的key-value存儲,即被定義成一個相似map<key1, map<key2,value>>的類型。它的row key決定了該行數據存儲在哪些節點中,所以row key須要按哈希來存儲,不能順序的掃描或讀取,而一個row內的column key是順序存儲的,能夠進行有序的掃描或範圍查找

圖數據庫

圖數據庫(Graph database)也可稱爲面向/基於圖的數據庫。它的基本含義是以「圖」這種數據結構存儲和查詢數據,不是存儲圖片的數據庫。圖數據庫的基本存儲單元爲:節點、關係、屬性。實體會被做爲頂點,而實體之間的關係則會被做爲邊

FlockDB

FlockDB是Twitter爲進行關係數據分析而構建的。FlockDB迄今爲止尚未穩定的版本,對於它是不是一個真正的圖形數據庫,尚有爭議。FlockDB和其它圖形數據庫(如Neo4j、OrientDB)的區別在於圖的遍歷,Twitter的數據模型不須要遍歷社交圖譜

Neo4j

Neo4j是一個流行的圖形數據庫,它是開源的。最近,Neo4j的社區版已經由遵循AGPL許可協議轉向了遵循GPL許可協議。儘管如此,Neo4j的企業版依然使用AGPL許可。Neo4j基於Java實現,兼容ACID特性,也支持其餘編程語言,如Ruby和Python

特色

實現數據共享:包含全部用戶可同時存取數據庫中的數據,也包括用戶能夠用各類方式經過接口使用數據庫,並提供數據共享
減小數據的冗餘度:因爲數據庫實現了數據共享,從而避免了用戶各自創建應用文件,減小了大量重複數據,減小了數據冗餘
數據的獨立性:包括邏輯獨立性(數據庫中數據庫的邏輯結構和應用程序相互獨立)和物理獨立性(數據物理結構的變化不影響數據的邏輯結構)
數據實現集中控制:對數據進行集中控制和管理,並經過數據模型表示各類數據的組織以及數據間的聯繫
數據一致性和可維護性:防止數據丟失、錯誤更新和越權使用;保證數據的正確性、有效性和相容性;在同一時間週期內,容許對數據實現多路存取
故障恢復:能儘快恢復數據庫系統運行時出現的故障,多是物理上或是邏輯上的錯誤

相關文章
相關標籤/搜索