淺談數(shù)據(jù)庫
數(shù)據(jù)庫介紹
數(shù)據(jù)庫(Database)指的是以一定方式儲存在一起、能為多個用戶共享、具有盡可能小的冗余度、與應用程序彼此獨立的數(shù)據(jù)集合。這種數(shù)據(jù)集合具有如下特點:盡可能不重復,以最優(yōu)方式為某個特定組織的多種應用服務,其數(shù)據(jù)結(jié)構(gòu)獨立于使用它的應用程序,對數(shù)據(jù)的增、刪、改、查由統(tǒng)一軟件進行管理和控制。隨著計算機在數(shù)據(jù)管理領域的普遍應用,人們對數(shù)據(jù)管理技術提出了更高的要求:希望面向企業(yè)或部門,以數(shù)據(jù)為中心組織數(shù)據(jù),減少數(shù)據(jù)的冗余,提供更高的數(shù)據(jù)共享能力,同時要求程序和數(shù)據(jù)具有較高的獨立性,當數(shù)據(jù)的邏輯結(jié)構(gòu)改變時,不涉及數(shù)據(jù)的物理結(jié)構(gòu),也不影響應用程序,以降低應用程序研制與維護的費用
數(shù)據(jù)庫管理系統(tǒng)(Database Management System)是為管理數(shù)據(jù)庫而設計的電腦軟件系統(tǒng),一般具有存儲、截取、安全保障、備份等基礎功能
數(shù)據(jù)庫的基本結(jié)構(gòu)分三個層次,反映了觀察數(shù)據(jù)庫的三種不同角度,不同層次之間的聯(lián)系是通過映射進行轉(zhuǎn)換的
數(shù)據(jù)庫的最內(nèi)層,是物理存貯設備上實際存儲的數(shù)據(jù)的集合。這些數(shù)據(jù)是原始數(shù)據(jù),是用戶加工的對象,由內(nèi)部模式描述的指令操作處理的位串、字符和字組成
數(shù)據(jù)庫的中間一層,是數(shù)據(jù)庫的整體邏輯表示。指出了每個數(shù)據(jù)的邏輯定義及數(shù)據(jù)間的邏輯聯(lián)系,是存貯記錄的集合。它所涉及的是數(shù)據(jù)庫所有對象的邏輯關系,而不是它們的物理情況,是數(shù)據(jù)庫管理員概念下的數(shù)據(jù)庫
用戶所看到和使用的數(shù)據(jù)庫,表示了一個或一些特定用戶使用的數(shù)據(jù)集合,即邏輯記錄的集合
數(shù)據(jù)庫的邏輯結(jié)構(gòu)通常分為層次數(shù)據(jù)庫、網(wǎng)絡數(shù)據(jù)庫和關系數(shù)據(jù)庫三種,不同的數(shù)據(jù)庫是按不同的數(shù)據(jù)結(jié)構(gòu)來聯(lián)系和組織的
關系數(shù)據(jù)庫(Relational database)是創(chuàng)建在關系模型基礎上的數(shù)據(jù)庫。它借助于集合代數(shù)等數(shù)學概念和方法來處理數(shù)據(jù)庫中的數(shù)據(jù)。它的模型是把復雜的數(shù)據(jù)結(jié)構(gòu)歸結(jié)為簡單的二元關系(即二維表格形式)。在關系數(shù)據(jù)庫中,對數(shù)據(jù)的操作幾乎全部建立在一個或多個關系表格上,通過對這些關聯(lián)的表格分類、合并、連接或選取等運算來實現(xiàn)數(shù)據(jù)庫的管理
在關系數(shù)據(jù)庫中,表[關系](Relation)是以列[屬性](Attribute)和行[值組](Tuple)的形式組織起來的數(shù)據(jù)的集合。
一個數(shù)據(jù)庫包括一個或多個表,數(shù)據(jù)庫表是一系列二維數(shù)組的集合。例如,下面是一個包含id、年齡、性別、國家的學生信息表:
學生信息表
ID | 姓名 | 性別 | 年齡 | 國家 |
---|---|---|---|---|
0 | KangKang | 18 | 男 | 中國 |
1 | Maria | 17 | 女 | 古巴 |
2 | Michael | 19 | 男 | 美國 |
3 | Jane | 16 | 女 | 英國 |
Oracle[??r?kl]數(shù)據(jù)庫(Oracle Database),又名Oracle
Oracle由至少一個表空間和數(shù)據(jù)庫模式對象組成。
模式是對象的集合,而模式對象是直接引用數(shù)據(jù)庫數(shù)據(jù)的邏輯結(jié)構(gòu)。
模式對象包括這樣一些結(jié)構(gòu):
表、視圖、序列、存儲過程、同義詞、索引、簇和數(shù)據(jù)庫鏈等。
邏輯存儲結(jié)構(gòu)包括表空間、段和范圍,用于描述怎樣使用數(shù)據(jù)庫的物理空間。
段(Segment)是表空間中一個指定類型的邏輯存儲結(jié)構(gòu),它由一個或多個范圍組成,段將占用并增長存儲空間
?數(shù)據(jù)段:用來存放表數(shù)據(jù)?索引段:用來存放表索引?臨時段:用來存放中間結(jié)果?回滾段:用于出現(xiàn)異常時,恢復事務
范圍(Extent)是數(shù)據(jù)庫存儲空間分配的邏輯單位,一個范圍由許多連續(xù)的數(shù)據(jù)塊組成,范圍是由段依次分配的,分配的第一個范圍稱為初始范圍,以后分配的范圍稱為增量范圍
MySQL[ma???skju???l](My Structure Quest Language)原本是一個開放源代碼的關系數(shù)據(jù)庫管理系統(tǒng),使用C和C++編寫,后被甲骨文公司(Oracle)收購,成為Oracle旗下產(chǎn)品。MySQL在過去由于性能高、成本低、可靠性好,已經(jīng)成為最流行的開源數(shù)據(jù)庫,因此被廣泛地應用在Internet上的中小型網(wǎng)站中。
隨著MySQL的不斷成熟,它也逐漸用于更大規(guī)模的網(wǎng)站和應用,比如維基百科(維基百科已于2013年正式宣布將從MySQL遷移到MariaDB數(shù)據(jù)庫)、Google和Facebook等網(wǎng)站,非常流行的開源軟件組合LAMP(Linux-Apache-MySQL-PHP)中的“M”指的就是MySQL
索引是一種特殊的文件,它們包含著對數(shù)據(jù)表里所有記錄的引用指針。索引不是萬能的,它可以加快數(shù)據(jù)檢索操作,但會使數(shù)據(jù)修改操作變慢。每修改數(shù)據(jù)記錄,索引就必須刷新一次。為了在某種程度上彌補這一缺陷,許多SQL命令都有一個DELAY_KEY_WRITE項。這個選項的作用是暫時制止 MySQL在該命令每插入一條新記錄和每修改一條現(xiàn)有之后立刻對索引進行刷新,對索引的刷新將等到全部記錄插入/修改完畢之后再進行。在需要把許多新記錄插入某個數(shù)據(jù)表的場合DELAY_KEY_WRITE選項的作用將非常明顯。另外,索引還會在硬盤上占用相當大的空間。因此應該只為最經(jīng)常查詢和最經(jīng)常排序的數(shù)據(jù)列建立索引。注意,如果某個數(shù)據(jù)列包含許多重復的內(nèi)容,為它建立索引就沒有太大的實際效果。從理論上講,完全可以為數(shù)據(jù)表里的每個字段分別建一個索引,但MySQL把同一個數(shù)據(jù)表里的索引總數(shù)限制為16個
MariaDB(名稱來自Michael Widenius的女兒Maria的名字)數(shù)據(jù)庫管理系統(tǒng)是MySQL的一個分支,主要由開源社區(qū)在維護,采用GPL授權(quán)許可。
開發(fā)這個分支的原因之一是:
甲骨文公司收購了MySQL后,有將MySQL閉源的潛在風險,因此社區(qū)采用分支的方式來避開這個風險
MariaDB基于事務的Maria存儲引擎,替換了MySQL的MyISAM存儲引擎,它使用了Percona的 XtraDB,InnoDB的變體
Microsoft SQL Server是由美國微軟公司所推出的關系數(shù)據(jù)庫解決方案,數(shù)據(jù)庫的內(nèi)置語言原本是采用美國標準局(ANSI)和國際標準組織(ISO)所定義的SQL語言。
SQL Server一開始并不是微軟自己研發(fā)的產(chǎn)品,而是當時為了要和IBM競爭時,與Sybase合作所產(chǎn)生的,其最早的發(fā)展者是Sybase,與Sybase終止合作關系后,SQL Server版本均由微軟自行研發(fā)
Microsoft Office Access[??kses]是微軟把數(shù)據(jù)庫引擎的圖形用戶界面和軟件開發(fā)工具結(jié)合在一起的一個關系數(shù)據(jù)庫管理系統(tǒng)。Access能夠訪問Access/Jet、Microsoft SQL Server、Oracle數(shù)據(jù)庫,或者任何ODBC(Open Database Connectivity)兼容數(shù)據(jù)庫內(nèi)的數(shù)據(jù)。雖然它支持部分面向?qū)ο蠹夹g,但是未能成為一種完整的面向?qū)ο箝_發(fā)工具。 它擁有的報表創(chuàng)建功能能夠處理任何它能夠訪問的數(shù)據(jù)源。Access提供功能參數(shù)化的查詢,這些查詢和Access表格可以被諸如VB6和.NET的其它程序通過DAO或ADO訪問;它的數(shù)據(jù)文件不能突破2G的限制,它的結(jié)構(gòu)化查詢語言(JET SQL)能力有限,不適合大型數(shù)據(jù)庫處理應用
Key-Value存儲,簡稱KV存儲。它是NoSQL存儲的一種方式。它的數(shù)據(jù)按照鍵值對的形式進行組織,索引和存儲。KV存儲非常適合不涉及過多數(shù)據(jù)關系業(yè)務關系的業(yè)務數(shù)據(jù),同時能有效減少讀寫磁盤的次數(shù),比SQL數(shù)據(jù)庫存儲擁有更好的讀寫性能
Redis是一個使用ANSI C編寫的開源、支持網(wǎng)絡、基于內(nèi)存、可選持久性的鍵值對存儲數(shù)據(jù)庫。Redis的外圍由一個鍵、值映射的字典構(gòu)成。與其他非關系數(shù)據(jù)庫主要不同在于:Redis中值的類型不僅限于字符串,還支持抽象數(shù)據(jù)類型:字符串列表、無序不重復的字符串集合、有序不重復的字符串集合、鍵、值都為字符串的哈希表。值的類型決定了值本身支持的操作。Redis支持不同無序、有序的列表,無序、有序的集合間的交集、并集等高級服務器端原子操作。Redis會周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現(xiàn)了master-slave(主從)同步。數(shù)據(jù)可以從主服務器向任意數(shù)量的從服務器上同步,從服務器可以是關聯(lián)其他從服務器的主服務器。這使得Redis可執(zhí)行單層樹復制。存盤可以有意無意的對數(shù)據(jù)進行寫操作。由于完全實現(xiàn)了發(fā)布/訂閱機制,使得從數(shù)據(jù)庫在任何地方同步樹時,可訂閱一個頻道并接收主服務器完整的消息發(fā)布記錄。同步對讀取操作的可擴展性和數(shù)據(jù)冗余很有幫助
Memcached是一個高性能的分布式內(nèi)存對象緩存系統(tǒng),用于動態(tài)Web應用以減輕數(shù)據(jù)庫負載。它通過在內(nèi)存中緩存數(shù)據(jù)和對象來減少讀取數(shù)據(jù)庫的次數(shù),從而提高動態(tài)、數(shù)據(jù)庫驅(qū)動網(wǎng)站的速度。是Danga Interactive為了LiveJournal所發(fā)展的,但被許多軟件(如MediaWiki)所使用。這是一套開放源代碼軟件,以BSD license授權(quán)協(xié)議發(fā)布。Memcached的API使用三十二比特的循環(huán)冗余校驗(CRC-32)計算鍵值后,將數(shù)據(jù)分散在不同的機器上。當表格滿了以后,接下來新增的數(shù)據(jù)會以LRU機制替換掉。由于Memcached通常只是當作緩存系統(tǒng)使用,所以使用Memcached的應用程序在寫回較慢的系統(tǒng)時(像是后端的數(shù)據(jù)庫)需要額外的代碼更新Memcached內(nèi)的數(shù)據(jù)
面向文檔的數(shù)據(jù)庫(Document-oriented DataBase)是一種被設計用于儲存、檢索和管理文檔導向信息(也稱為“半結(jié)構(gòu)化數(shù)據(jù)”)的計算機程序。文檔導向的數(shù)據(jù)庫是NoSQL數(shù)據(jù)庫的一個主要類別,文檔導向的數(shù)據(jù)庫的普及程度已經(jīng)隨著NoSQL本身被不斷使用而有所增長。XML數(shù)據(jù)庫是針對XML文件做了優(yōu)化的文檔導向的數(shù)據(jù)庫的子類。文檔存儲支持對結(jié)構(gòu)化數(shù)據(jù)的訪問,不同于關系模型的是,文檔存儲沒有強制的架構(gòu)。事實上,文檔存儲以封包鍵值對的方式進行存儲。在這種情況下,應用對要檢索的封包采取一些約定,或者利用存儲引擎的能力將不同的文檔劃分成不同的集合,以管理數(shù)據(jù)。與關系模型不同的是,文檔存儲模型支持嵌套結(jié)構(gòu);與鍵值存儲不同的是,文檔存儲關心文檔的內(nèi)部結(jié)構(gòu)
MongoDB是一個基于分布式文件存儲的數(shù)據(jù)庫,由C++語言編寫,旨在為WEB應用提供可擴展的高性能數(shù)據(jù)存儲解決方案。它是一個介于關系數(shù)據(jù)庫和非關系數(shù)據(jù)庫之間的產(chǎn)品,是非關系數(shù)據(jù)庫當中功能最豐富,最像關系數(shù)據(jù)庫的。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似JSON(JavaScript Object Notation)的BSON(Binary Serialized Document Format)格式,因此可以存儲比較復雜的數(shù)據(jù)類型。Mongo最大的特點是他支持的查詢語言非常強大,其語法有點類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實現(xiàn)類似關系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對數(shù)據(jù)建立索引。它使用內(nèi)存映射文件, 32位系統(tǒng)上限制大小為2GB的數(shù)據(jù)(64位支持更大的數(shù)據(jù))
Apache CouchDB(Cluster Of Unreliable Commodity Hardware DataBase)是一個開源的面向文檔的數(shù)據(jù)庫管理系統(tǒng),它是一個使用JSON作為存儲格式,JavaScript作為查詢語言,MapReduce和HTTP作為API的NoSQL數(shù)據(jù)庫。不同于關系型數(shù)據(jù)庫,CouchDB沒有將數(shù)據(jù)和關系存儲在表格里。替代的,一個應用程序可能會訪問多個數(shù)據(jù)庫,每個數(shù)據(jù)庫是一個獨立的文檔集合,每一個文檔維護其自己獨立的數(shù)據(jù)和自包涵的schema。CouchDB實現(xiàn)了一個多版本并發(fā)控制(MVCC)形式,用來避免在數(shù)據(jù)庫寫操作的時候?qū)ξ募M行加鎖,沖突留給應用程序去解決。解決一個沖突的通用操作的是首先合并數(shù)據(jù)到其中一個文檔,然后刪除舊的數(shù)據(jù)
列式數(shù)據(jù)庫是以列相關存儲架構(gòu)進行數(shù)據(jù)存儲的數(shù)據(jù)庫,主要適合于批量數(shù)據(jù)處理和即時查詢;與之對應的是行式數(shù)據(jù)庫,數(shù)據(jù)以行相關的存儲體系架構(gòu)進行空間分配,主要適合于小批量的數(shù)據(jù)處理,常用于聯(lián)機事務型數(shù)據(jù)處理
數(shù)據(jù)庫以行、列的二維表的形式存儲數(shù)據(jù),但是卻以一維字符串的方式存儲。列式數(shù)據(jù)庫把一列中的數(shù)據(jù)值串在一起存儲起來,然后再存儲下一列的數(shù)據(jù);行式數(shù)據(jù)庫把一行中的數(shù)據(jù)值串在一起存儲起來,然后再存儲下一行的數(shù)據(jù)
Apache HBase最初是Powerset公司為了處理自然語言搜索產(chǎn)生的海量數(shù)據(jù)而開展的項目。不過現(xiàn)在它已經(jīng)是Apache基金會的頂級項目,它是一個開源的非關系型分布式數(shù)據(jù)庫(NoSQL),參考了谷歌的BigTable建模,實現(xiàn)的編程語言為 Java,運行于HDFS文件系統(tǒng)之上,為 Hadoop 提供類似于BigTable 規(guī)模的服務。因此,它可以容錯地存儲海量稀疏的數(shù)據(jù)。它在列上實現(xiàn)了BigTable論文提到的壓縮算法、內(nèi)存操作和布隆過濾器。HBase的表能夠作為MapReduce任務的輸入和輸出,可以通過Java API來訪問數(shù)據(jù),也可以通過REST、Avro或者Thrift的API來訪問
Apache Cassandra(社區(qū)內(nèi)一般簡稱為C*)是一套開源分布式NoSQL數(shù)據(jù)庫系統(tǒng)。它最初由Facebook開發(fā),用于儲存收件箱等簡單格式數(shù)據(jù),是一種流行的分布式結(jié)構(gòu)化數(shù)據(jù)存儲方案。它的數(shù)據(jù)并不存儲在分布式文件系統(tǒng)如GFS或HDFS中,而是直接存于本地 使用了Google 設計的 BigTable的數(shù)據(jù)模型,與面向行(row)的傳統(tǒng)的關系型數(shù)據(jù)庫或鍵值存儲的key-value數(shù)據(jù)庫不同,Cassandra使用的是寬列存儲模型(Wide Column Stores),每行數(shù)據(jù)由row key唯一標識之后,可以有最多20億個列,每個列由一個column key標識,每個column key下對應若干value。這種模型可以理解為是一個二維的key-value存儲,即被定義成一個類似map>的類型。它的row key決定了該行數(shù)據(jù)存儲在哪些節(jié)點中,因此row key需要按哈希來存儲,不能順序的掃描或讀取,而一個row內(nèi)的column key是順序存儲的,可以進行有序的掃描或范圍查找
圖數(shù)據(jù)庫(Graph database)也可稱為面向/基于圖的數(shù)據(jù)庫。它的基本含義是以“圖”這種數(shù)據(jù)結(jié)構(gòu)存儲和查詢數(shù)據(jù),不是存儲圖片的數(shù)據(jù)庫。圖數(shù)據(jù)庫的基本存儲單元為:節(jié)點、關系、屬性。實體會被作為頂點,而實體之間的關系則會被作為邊
FlockDB是Twitter為進行關系數(shù)據(jù)分析而構(gòu)建的。FlockDB迄今為止還沒有穩(wěn)定的版本,對于它是否是一個真正的圖形數(shù)據(jù)庫,尚有爭議。FlockDB和其它圖形數(shù)據(jù)庫(如Neo4j、OrientDB)的區(qū)別在于圖的遍歷,Twitter的數(shù)據(jù)模型不需要遍歷社交圖譜
Neo4j是一個流行的圖形數(shù)據(jù)庫,它是開源的。最近,Neo4j的社區(qū)版已經(jīng)由遵循AGPL許可協(xié)議轉(zhuǎn)向了遵循GPL許可協(xié)議。盡管如此,Neo4j的企業(yè)版依然使用AGPL許可。Neo4j基于Java實現(xiàn),兼容ACID特性,也支持其他編程語言,如Ruby和Python
實現(xiàn)數(shù)據(jù)共享:包含所有用戶可同時存取數(shù)據(jù)庫中的數(shù)據(jù),也包括用戶可以用各種方式通過接口使用數(shù)據(jù)庫,并提供數(shù)據(jù)共享
減少數(shù)據(jù)的冗余度:由于數(shù)據(jù)庫實現(xiàn)了數(shù)據(jù)共享,從而避免了用戶各自建立應用文件,減少了大量重復數(shù)據(jù),減少了數(shù)據(jù)冗余
數(shù)據(jù)的獨立性:包括邏輯獨立性(數(shù)據(jù)庫中數(shù)據(jù)庫的邏輯結(jié)構(gòu)和應用程序相互獨立)和物理獨立性(數(shù)據(jù)物理結(jié)構(gòu)的變化不影響數(shù)據(jù)的邏輯結(jié)構(gòu))
數(shù)據(jù)實現(xiàn)集中控制:對數(shù)據(jù)進行集中控制和管理,并通過數(shù)據(jù)模型表示各種數(shù)據(jù)的組織以及數(shù)據(jù)間的聯(lián)系
數(shù)據(jù)一致性和可維護性:防止數(shù)據(jù)丟失、錯誤更新和越權(quán)使用;保證數(shù)據(jù)的正確性、有效性和相容性;在同一時間周期內(nèi),允許對數(shù)據(jù)實現(xiàn)多路存取
故障恢復:能盡快恢復數(shù)據(jù)庫系統(tǒng)運行時出現(xiàn)的故障,可能是物理上或是邏輯上的錯誤
咨詢熱線
18611170056官方微信
返回頂部