元型資料庫
Ⅰ 如何用 Python 實現一個圖資料庫(Graph Database)
本文章是 重寫 500 Lines or Less 系列的其中一篇,目標是重寫 500 Lines or Less 系列的原有項目:Dagoba: an in-memory graph database。
Dagoba 是作者設計用來展示如何從零開始自己實現一個圖資料庫( Graph Database )。該名字似乎來源於作者喜歡的一個樂隊,另一個原因是它的前綴 DAG 也正好是有向無環圖 ( Directed Acyclic Graph ) 的縮寫。本文也沿用了該名稱。
圖是一種常見的數據結構,它將信息描述為若干獨立的節點( vertex ,為了和下文的邊更加對稱,本文中稱為 node ),以及把節點關聯起來的邊( edge )。我們熟悉的鏈表以及多種樹結構可以看作是符合特定規則的圖。圖在路徑選擇、推薦演算法以及神經網路等方面都是重要的核心數據結構。
既然圖的用途如此廣泛,一個重要的問題就是如何存儲它。如果在傳統的關系資料庫中存儲圖,很自然的做法就是為節點和邊各自創建一張表,並用外鍵把它們關聯起來。這樣的話,要查找某人所有的子女,就可以寫下類似下面的查詢:
還好,不算太復雜。但是如果要查找孫輩呢?那恐怕就要使用子查詢或者 CTE(Common Table Expression) 等特殊構造了。再往下想,曾孫輩又該怎麼查詢?孫媳婦呢?
這樣我們會意識到,sql 作為查詢語言,它只是對二維數據表這種結構而設計的,用它去查詢圖的話非常笨拙,很快會變得極其復雜,也難以擴展。針對圖而言,我們希望有一種更為自然和直觀的查詢語法,類似這樣:
為了高效地存儲和查詢圖這種數據結構,圖資料庫( Graph Database )應運而生。因為和傳統的關系型資料庫存在極大的差異,所以它屬於新型資料庫也就是 NoSql 的一個分支(其他分支包括文檔資料庫、列資料庫等)。圖資料庫的主要代表包括 Neo4J 等。本文介紹的 Dagoba 則是具備圖資料庫核心功能、主要用於教學和演示的一個簡單的圖資料庫。
原文代碼是使用 JavaScript 編寫的,在定義調用介面時大量使用了原型( prototype )這種特有的語言構造。對於其他主流語言的用戶來說,原型的用法多少顯得有些別扭和不自然。
考慮到本系列其他資料庫示例大多是用 Python 實現的,本文也按照傳統,用 Python 重寫了原文的代碼。同樣延續之前的慣例,為了讓讀者更好地理解程序是如何逐步完善的,我們用迭代式的方法完成程序的各個組成部分。
原文在 500lines 系列的 Github 倉庫中只包含了實現代碼,並未包含測試。按照代碼注釋說明,測試程序位於作者的另一個代碼庫中,不過和 500lines 版本的實現似乎略有不同。
本文實現的代碼參考了原作者的測試內容,但跳過了北歐神話這個例子——我承認確實不熟悉這些神祇之間的親緣關系,相信中文背景的讀者們多數也未必了解,雖然作者很喜歡這個例子,想了想還是不要徒增困惑吧。因此本文在編寫測試用例時只參考了原文關於家族親屬的例子,放棄了神話相關的部分,盡管會減少一些趣味性,相信對於入門級的代碼來說這樣也夠用了。
本文實現程序位於代碼庫的 dagoba 目錄下。按照本系列程序的同意規則,要想直接執行各個已完成的步驟,讀者可以在根目錄下的 main.py 找到相應的代碼位置,取消注釋並運行即可。
本程序的所有步驟只需要 Python3 ,測試則使用內置的 unittest , 不需要額外的第三方庫。原則上 Python3.6 以上版本應該都可運行,但我只在 Python3.8.3 環境下完整測試過。
本文實現的程序從最簡單的案例開始,通過每個步驟逐步擴展,最終形成一個完整的程序。這些步驟包括:
接下來依次介紹各個步驟。
回想一下,圖資料庫就是一些點( node )和邊( edge )的集合。現在我們要做出的一個重大決策是如何對節點/邊進行建模。對於邊來說,必須指定它的關聯關系,也就是從哪個節點指向哪個節點。大多數情況下邊是有方向的——父子關系不指明方向可是要亂套的!
考慮到擴展性及通用性問題,我們可以把數據保存為字典( dict ),這樣可以方便地添加用戶需要的任何數據。某些數據是為資料庫內部管理而保留的,為了明確區分,可以這樣約定:以下劃線開頭的特殊欄位由資料庫內部維護,類似於私有成員,用戶不應該自己去修改它們。這也是 Python 社區普遍遵循的約定。
此外,節點和邊存在互相引用的關系。目前我們知道邊會引用到兩端的節點,後面還會看到,為了提高效率,節點也會引用到邊。如果僅僅在內存中維護它們的關系,那麼使用指針訪問是很直觀的,但資料庫必須考慮到序列化到磁碟的問題,這時指針就不再好用了。
為此,最好按照資料庫的一般要求,為每個節點維護一個主鍵( _id ),用主鍵來描述它們之間的關聯關系。
我們第一步要把資料庫的模型建立起來。為了測試目的,我們使用一個最簡單的資料庫模型,它只包含兩個節點和一條邊,如下所示:
按照 TDD 的原則,首先編寫測試:
與原文一樣,我們把資料庫管理介面命名為 Dagoba 。目前,能夠想到的最簡單的測試是確認節點和邊是否已經添加到資料庫中:
assert_item 是一個輔助方法,用於檢查字典是否包含預期的欄位。相信大家都能想到該如何實現,這里就不再列出了,讀者可參考 Github 上的完整源碼。
現在,測試是失敗的。用最簡單的辦法實現資料庫:
需要注意的是,不管添加節點還是查詢,程序都使用了拷貝後的數據副本,而不是直接使用原始數據。為什麼要這樣做?因為字典是可變的,用戶可以在任何時候修改其中的內容,如果資料庫不知道數據已經變化,就很容易發生難以追蹤的一致性問題,最糟糕的情況下會使得數據內容徹底混亂。
拷貝數據可以避免上述問題,代價則是需要佔用更多內存和處理時間。對於資料庫來說,通常查詢次數要遠遠多於修改,所以這個代價是可以接受的。
現在測試應該正常通過了。為了讓它更加完善,我們可以再測試一些邊緣情況,看看資料庫能否正確處理異常數據,比如:
例如,如果用戶嘗試添加重復主鍵,我們預期應拋出 ValueError 異常。因此編寫測試如下:
為了滿足以上測試,代碼需要稍作修改。特別是按照 id 查找主鍵是個常用操作,通過遍歷的方法效率太低了,最好是能夠通過主鍵直接訪問。因此在資料庫中再增加一個字典:
完整代碼請參考 Github 倉庫。
在上個步驟,我們在初始化資料庫時為節點明確指定了主鍵。按照資料庫設計的一般原則,主鍵最好是不具有業務含義的代理主鍵( Surrogate key ),用戶不應該關心它具體的值是什麼,因此讓資料庫去管理主鍵通常是更為合理的。當然,在部分場景下——比如導入外部數據——明確指定主鍵仍然是有用的。
為了同時支持這些要求,我們這樣約定:欄位 _id 表示節點的主鍵,如果用戶指定了該欄位,則使用用戶設置的值(當然,用戶有責任保證它們不會重復);否則,由資料庫自動為它分配一個主鍵。
如果主鍵是資料庫生成的,事先無法預知它的值是什麼,而邊( edge )必須指定它所指向的節點,因此必須在主鍵生成後才能添加。由於這個原因,在動態生成主鍵的情況下,資料庫的初始化會略微復雜一些。還是先寫一個測試:
為支持此功能,我們在資料庫中添加一個內部欄位 _next_id 用於生成主鍵,並讓 add_node 方法返回新生成的主鍵:
接下來,再確認一下邊是否可以正常訪問:
運行測試,一切正常。這個步驟很輕松地完成了,不過兩個測試( DbModelTest 和 PrimaryKeyTest )出現了一些重復代碼,比如 get_item 。我們可以把這些公用代碼提取出來。由於 get_item 內部調用了 TestCase.assertXXX 等方法,看起來應該使用繼承,但從 TestCase 派生基類容易引起一些潛在的問題,所以我轉而使用另一個技巧 Mixin :
實現資料庫模型之後,接下來就要考慮如何查詢它了。
在設計查詢時要考慮幾個問題。對於圖的訪問來說,幾乎總是由某個節點(或符合條件的某一類節點)開始,從與它相鄰的邊跳轉到其他節點,依次類推。所以鏈式調用對查詢來說是一種很自然的風格。舉例來說,要知道 Tom 的孫子養了幾只貓,可以使用類似這樣的查詢:
可以想像,以上每個方法都應該返回符合條件的節點集合。這種實現是很直觀的,不過存在一個潛在的問題:很多時候用戶只需要一小部分結果,如果它總是不計代價地給我們一個巨大的集合,會造成極大的浪費。比如以下查詢:
為了避免不必要的浪費,我們需要另外一種機制,也就是通常所稱的「懶式查詢」或「延遲查詢」。它的基本思想是,當我們調用查詢方法時,它只是把查詢條件記錄下來,而並不立即返回結果,直到明確調用某些方法時才真正去查詢資料庫。
如果讀者比較熟悉流行的 Python ORM,比如 SqlAlchemy 或者 Django ORM 的話,會知道它們幾乎都是懶式查詢的,要調用 list(result) 或者 result[0:10] 這樣的方法才能得到具體的查詢結果。
在 Dagoba 中把觸發查詢的方法定義為 run 。也就是說,以下查詢執行到 run 時才真正去查找數據:
和懶式查詢( Lazy Query )相對應的,直接返回結果的方法一般稱作主動查詢( Eager Query )。主動查詢和懶式查詢的內在查找邏輯基本上是相同的,區別只在於觸發機制不同。由於主動查詢實現起來更加簡單,出錯也更容易排查,因此我們先從主動查詢開始實現。
還是從測試開始。前面測試所用的簡單資料庫數據太少,難以滿足查詢要求,所以這一步先來創建一個更復雜的數據模型:
此關系的復雜之處之一在於反向關聯:如果 A 是 B 的哥哥,那麼 B 就是 A 的弟弟/妹妹,為了查詢到他們彼此之間的關系,正向關聯和反向關聯都需要存在,因此在初始化資料庫時需要定義的邊數量會很多。
當然,父子之間也存在反向關聯的問題,為了讓問題稍微簡化一些,我們目前只需要向下(子孫輩)查找,可以稍微減少一些關聯數量。
因此,我們定義數據模型如下。為了減少重復工作,我們通過 _backward 欄位定義反向關聯,而資料庫內部為了查詢方便,需要把它維護成兩條邊:
然後,測試一個最簡單的查詢,比如查找某人的所有孫輩:
這里 outcome/income 分別表示從某個節點出發、或到達它的節點集合。在原作者的代碼中把上述方法稱為 out/in 。當然這樣看起來更加簡潔,可惜的是 in 在 Python 中是個關鍵字,無法作為函數名。我也考慮過加個下劃線比如 out_.in_ 這種形式,但看起來也有點怪異,權衡之後還是使用了稍微啰嗦一點的名稱。
現在我們可以開始定義查詢介面了。在前面已經說過,我們計劃分別實現兩種查詢,包括主動查詢( Eager Query )以及延遲查詢( Lazy Query )。
它們的內在查詢邏輯是相通的,看起來似乎可以使用繼承。不過遵循 YAGNI 原則,目前先不這樣做,而是只定義兩個新類,在滿足測試的基礎上不斷擴展。以後我們會看到,與繼承相比,把共同的邏輯放到資料庫本身其實是更為合理的。
接下來實現訪問節點的方法。由於 EagerQuery 調用查詢方法會立即返回結果,我們把結果記錄在 _result 內部欄位中。雖然 node 方法只返回單個結果,但考慮到其他查詢方法幾乎都是返回集合,為統一起見,讓它也返回集合,這樣可以避免同時支持集合與單結果的分支處理,讓代碼更加簡潔、不容易出錯。此外,如果查詢對象不存在的話,我們只返回空集合,並不視為一個錯誤。
查詢輸入/輸出節點的方法實現類似這樣:
查找節點的核心邏輯在資料庫本身定義:
以上使用了內部定義的一些輔助查詢方法。用類似的邏輯再定義 income ,它們的實現都很簡單,讀者可以直接參考源碼,此處不再贅述。
在此步驟的最後,我們再實現一個優化。當多次調用查詢方法後,結果可能會返回重復的數據,很多時候這是不必要的。就像關系資料庫通常支持 unique/distinct 一樣,我們也希望 Dagoba 能夠過濾重復的數據。
假設我們要查詢某人所有孩子的祖父,顯然不管有多少孩子,他們的祖父應該是同一個人。因此編寫測試如下:
現在來實現 unique 。我們只要按照主鍵把重復數據去掉即可:
在上個步驟,初始化資料庫指定了雙向關聯,但並未測試它們。因為我們還沒有編寫代碼去支持它們,現在增加一個測試,它應該是失敗的:
運行測試,的確失敗了。我們看看要如何支持它。回想一下,當從邊查找節點時,使用的是以下方法:
這里也有一個潛在的問題:調用 self.edges 意味著遍歷所有邊,當資料庫內容較多時,這是巨大的浪費。為了提高性能,我們可以把與節點相關的邊記錄在節點本身,這樣要查找邊只要看節點本身即可。在初始化時定義出入邊的集合:
在添加邊時,我們要同時把它們對應的關系同時更新到節點,此外還要維護反向關聯。這涉及對字典內容的部分復制,先編寫一個輔助方法:
然後,將添加邊的實現修改如下:
這里的代碼同時添加正向關聯和反向關聯。有的朋友可能會注意到代碼略有重復,是的,但是重復僅出現在該函數內部,本著「三則重構」的原則,暫時不去提取代碼。
實現之後,前面的測試就可以正常通過了。
在這個步驟中,我們來實現延遲查詢( Lazy Query )。
延遲查詢的要求是,當調用查詢方法時並不立即執行,而是推遲到調用特定方法,比如 run 時才執行整個查詢,返回結果。
延遲查詢的實現要比主動查詢復雜一些。為了實現延遲查詢,查詢方法的實現不能直接返回結果,而是記錄要執行的動作以及傳入的參數,到調用 run 時再依次執行前面記錄下來的內容。
如果你去看作者的實現,會發現他是用一個數據結構記錄執行操作和參數,此外還有一部分邏輯用來分派對每種結構要執行的動作。這樣當然是可行的,但數據處理和分派部分的實現會比較復雜,也容易出錯。
本文的實現則選擇了另外一種不同的方法:使用 Python 的內部函數機制,把一連串查詢變換成一組函數,每個函數取上個函數的執行結果作為輸入,最後一個函數的輸出就是整個查詢的結果。由於內部函數同時也是閉包,盡管每個查詢的參數形式各不相同,但是它們都可以被閉包「捕獲」而成為內部變數,所以這些內部函數可以採用統一的形式,無需再針對每種查詢設計額外的數據結構,因而執行過程得到了很大程度的簡化。
首先還是來編寫測試。 LazyQueryTest 和 EagerQueryTest 測試用例幾乎是完全相同的(是的,兩種查詢只在於內部實現機制不同,它們的調用介面幾乎是完全一致的)。
因此我們可以把 EagerQueryTest 的測試原樣不變拷貝到 LazyQueryTest 中。當然拷貝粘貼不是個好注意,對於比較冗長而固定的初始化部分,我們可以把它提取出來作為兩個測試共享的公共函數。讀者可參考代碼中的 step04_lazy_query/tests/test_lazy_query.py 部分。
程序把查詢函數的串列執行稱為管道( pipeline ),用一個變數來記錄它:
然後依次實現各個調用介面。每種介面的實現都是類似的:用內部函數執行真正的查詢邏輯,再把這個函數添加到 pipeline 調用鏈中。比如 node 的實現類似下面:
其他介面的實現也與此類似。最後, run 函數負責執行所有查詢,返回最終結果;
完成上述實現後執行測試,確保我們的實現是正確的。
在前面我們說過,延遲查詢與主動查詢相比,最大的優勢是對於許多查詢可以按需要訪問,不需要每個步驟都返回完整結果,從而提高性能,節約查詢時間。比如說,對於下面的查詢:
以上查詢的意思是從孫輩中找到一個符合條件的節點即可。對該查詢而言,主動查詢會在調用 outcome('son') 時就遍歷所有節點,哪怕最後一步只需要第一個結果。而延遲查詢為了提高效率,應在找到符合條件的結果後立即停止。
目前我們尚未實現 take 方法。老規矩,先添加測試:
主動查詢的 take 實現比較簡單,我們只要從結果中返回前 n 條記錄:
延遲查詢的實現要復雜一些。為了避免不必要的查找,返回結果不應該是完整的列表( list ),而應該是個按需返回的可迭代對象,我們用內置函數 next 來依次返回前 n 個結果:
寫完後運行測試,確保它們是正確的。
從外部介面看,主動查詢和延遲查詢幾乎是完全相同的,所以用單純的數據測試很難確認後者的效率一定比前者高,用訪問時間來測試也並不可靠。為了測試效率,我們引入一個節點訪問次數的概念,如果延遲查詢效率更高的話,那麼它應該比主動查詢訪問節點的次數更少。
為此,編寫如下測試:
我們為 Dagoba 類添加一個成員來記錄總的節點訪問次數,以及兩個輔助方法,分別用於獲取和重置訪問次數:
然後瀏覽代碼,查找修改點。增加計數主要在從邊查找節點的時候,因此修改部分如下:
此外還有 income/outcome 方法,修改都很簡單,這里就不再列出。
實現後再次運行測試。測試通過,表明延遲查詢確實在效率上優於主動查詢。
不像關系資料庫的結構那樣固定,圖的形式可以千變萬化,查詢機制也必須足夠靈活。從原理上講,所有查詢無非是從某個節點出發按照特定方向搜索,因此用 node/income/outcome 這三個方法幾乎可以組合出任意所需的查詢。
但對於復雜查詢,寫出的代碼有時會顯得較為瑣碎和冗長,對於特定領域來說,往往存在更為簡潔的名稱,例如:母親的兄弟可簡稱為舅舅。對於這些場景,如果能夠類似 DSL (領域特定語言)那樣允許用戶根據專業要求自行擴展,從而簡化查詢,方便閱讀,無疑會更為友好。
如果讀者去看原作者的實現,會發現他是用一種特殊語法 addAlias 來定義自己想要的查詢,調用方法時再進行查詢以確定要執行的內容,其介面和內部實現都是相當復雜的。
而我希望有更簡單的方法來實現這一點。所幸 Python 是一種高度動態的語言,允許在運行時向類中增加新的成員,因此做到這一點可能比預想的還要簡單。
為了驗證這一點,編寫測試如下:
無需 Dagoba 的實現做任何改動,測試就可以通過了!其實我們要做的就是動態添加一個自定義的成員函數,按照 Python 對象機制的要求,成員函數的第一個成員應該是名為 self 的參數,但這里已經是在 UnitTest 的內部,為了和測試類本身的 self 相區分,新函數的參數增加了一個下劃線。
此外,函數應返回其所屬的對象,這是為了鏈式調用所要求的。我們看到,動態語言的靈活性使得添加新語法變得非常簡單。
到此,一個初具規模的圖資料庫就形成了。
和原文相比,本文還缺少一些內容,比如如何將資料庫序列化到磁碟。不過相信讀者都看到了,我們的資料庫內部結構基本上是簡單的原生數據結構(列表+字典),因此序列化無論用 pickle 或是 JSON 之類方法都應該是相當簡單的。有興趣的讀者可以自行完成它們。
我們的圖資料庫實現為了提高查詢性能,在節點內部存儲了邊的指針(或者說引用)。這樣做的好處是,無論資料庫有多大,從一個節點到相鄰節點的訪問是常數時間,因此數據訪問的效率非常高。
但一個潛在的問題是,如果資料庫規模非常大,已經無法整個放在內存中,或者出於安全性等原因要實現分布式訪問的話,那麼指針就無法使用了,必須要考慮其他機制來解決這個問題。分布式資料庫無論採用何種數據模型都是一個棘手的問題,在本文中我們沒有涉及。有興趣的讀者也可以考慮 500lines 系列中關於分布式和集群演算法的其他一些文章。
本文的實現和系列中其他資料庫類似,採用 Python 作為實現語言,而原作者使用的是 JavaScript ,這應該和作者的背景有關。我相信對於大多數開發者來說, Python 的對象機制比 JavaScript 基於原型的語法應該是更容易閱讀和理解的。
當然,原作者的版本比本文版本在實現上其實是更為完善的,靈活性也更好。如果想要更為優雅的實現,我們可以考慮使用 Python 元編程,那樣會更接近於作者的實現,但也會讓程序的復雜性大為增加。如果讀者有興趣,不妨對照著去讀讀原作者的版本。
Ⅱ 常用的資料庫有哪些
1. IBM 的DB2
作為關系資料庫領域的開拓者和領航人,IBM在1997年完成了System R系統的原型,1980年開始提供集成的資料庫伺服器—— System/38,隨後是SQL/DSforVSE和VM,其初始版本與SystemR研究原型密切相關。DB2 forMVSV1 在1983年推出。該版本的目標是提供這一新方案所承諾的簡單性,數據不相關性和用戶生產率。1988年DB2 for MVS 提供了強大的在線事務處理(OLTP)支持,1989 年和1993 年分別以遠程工作單元和分布式工作單元實現了分布式資料庫支持。最近推出的DB2 Universal Database 6.1則是通用資料庫的典範,是第一個具備網上功能的多媒體關系資料庫管理系統,支持包括Linux在內的一系列平台。
2. Oracle
Oracle 前身叫SDL,由Larry Ellison 和另兩個編程人員在1977創辦,他們開發了自己的拳頭產品,在市場上大量銷售,1979 年,Oracle公司引入了第一個商用SQL 關系資料庫管理系統。Oracle公司是最早開發關系資料庫的廠商之一,其產品支持最廣泛的操作系統平台。目前Oracle關系資料庫產品的市場佔有率名列前茅。
3. Informix
Informix在1980年成立,目的是為Unix等開放操作系統提供專業的關系型資料庫產品。公司的名稱Informix便是取自Information 和Unix的結合。Informix第一個真正支持SQL語言的關系資料庫產品是Informix SE(StandardEngine)。InformixSE是在當時的微機Unix環境下主要的資料庫產品。它也是第一個被移植到Linux上的商業資料庫產品。
4. Sybase
Sybase公司成立於1984年,公司名稱「Sybase」取自「system」和 「database」 相結合的含義。Sybase公司的創始人之一Bob Epstein 是Ingres 大學版(與System/R同時期的關系資料庫模型產品)的主要設計人員。公司的第一個關系資料庫產品是1987年5月推出的SybaseSQLServer1.0。Sybase首先提出Client/Server 資料庫體系結構的思想,並率先在Sybase SQLServer 中實現。
5. SQL Server
1987 年,微軟和 IBM合作開發完成OS/2,IBM 在其銷售的OS/2 ExtendedEdition 系統中綁定了OS/2Database Manager,而微軟產品線中尚缺少資料庫產品。為此,微軟將目光投向Sybase,同Sybase 簽訂了合作協議,使用Sybase的技術開發基於OS/2平台的關系型資料庫。1989年,微軟發布了SQL Server 1.0 版。
6.PostgreSQL
PostgreSQL 是一種特性非常齊全的自由軟體的對象——關系性資料庫管理系統(ORDBMS),它的很多特性是當今許多商業資料庫的前身。PostgreSQL最早開始於BSD的Ingres項目。PostgreSQL 的特性覆蓋了SQL-2/SQL-92和SQL-3。首先,它包括了可以說是目前世界上最豐富的數據類型的支持;其次,目前PostgreSQL 是唯一支持事務、子查詢、多版本並行控制系統、數據完整性檢查等特性的唯一的一種自由軟體的資料庫管理系統.
7.mySQL
mySQL是一個小型關系型資料庫管理系統,開發者為瑞典MySQL AB公司。在2008年1月16號被Sun公司收購。目前MySQL被廣泛地應用在Internet上的中小型網站中。由於其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,許多中小型網站為了降低網站總體擁有成本而選擇了MySQL作為網站資料庫。MySQL的官方網站的網址是: www.mysql.com
Ⅲ 數據挖掘概念綜述
數據挖掘概念綜述
數據挖掘又稱從資料庫中發現知識(KDD)、數據分析、數據融合(Data Fusion)以及決策支持。KDD一詞首次出現在1989年8月舉行的第11屆國際聯合人工智慧學術會議上。隨後在1991年、1993年和1994年都舉行KDD 專題討論會,匯集來自各個領域的研究人員和應用開發者,集中討論數據統計、海量數據分析算 法、知識表示、知識運用等問題。隨著參與人員的不斷增多,KDD國際會議發展成為年會。1998 年在美國紐約舉行的第四屆知識發現與數據 挖掘國際學術會議不僅進行了學術討論,並且有30多家軟體公司展示了他們的數據挖掘軟體產品,不少軟體已在北美、歐洲等國得到應用。
一、什麼是數據挖掘
1.1、數據挖掘的歷史
近十幾年來,人們利用信息技術生產和搜集數據的能力大幅度提高,千萬萬個資料庫被用於商業管理、政府辦公、科學研究和工程開發等等,這一勢頭仍將持續發展下去。於是,一個新的挑戰被提了出來:在這被稱之為信息爆炸的時代,信息過量幾乎成為人人需要面對的問題。如何才能不被信息的汪洋大海所淹沒,從中及時發現有用的知識,提高信息利用率呢?要想使數據真正成為一個公司的資源,只有充分利用它為公司自身的業務決策和戰略發展服務才行,否則大量的數據可能成為包袱,甚至成為垃圾。因此,面對」人們被數據淹沒,人們卻飢餓於知識」的挑戰。另一方面計算機技術的另一領域——人工智慧自1956年誕生之後取得了重大進展。經歷了博弈時期、自然語言理解、知識工程等階段,目前的研究 熱點是機器學習。機器學習是用計算機模擬人類學習的一門科學,比較成熟的演算法有神經網路、遺傳演算法等。用資料庫管理系統來存儲數據,用機器學習的方法來分析數據,挖掘大量數據背後的知識,這兩者的結合促成了資料庫中的知識發現(KDD:Knowledge Discovery in Databases)的產生,因此,數據挖掘和知識發現(DMKD)技術應運而生,並得以蓬勃發展,越來越顯示出其強大的生命力。
數據挖掘又稱從資料庫中發現知識(KDD)、數據分析、數據融合(Data Fusion)以及決策支持。KDD一詞首次出現在1989年8月舉行的第11屆國際聯合人工智慧學術會議上。隨後在1991年、1993年和1994年都舉行KDD 專題討論會,匯集來自各個領域的研究人員和應用開發者,集中討論數據統計、海量數據分析算 法、知識表示、知識運用等問題。隨著參與人員的不斷增多,KDD國際會議發展成為年會。1998 年在美國紐約舉行的第四屆知識發現與數據 挖掘國際學術會議不僅進行了學術討論,並且有30多家軟體公司展示了他們的數據挖掘軟體產品,不少軟體已在北美、歐洲等國得到應用。
2.2數據挖掘的概念
從1989年到現在,KDD的定義隨著人們研究的不斷深入也在不斷完善,目前比較公認的定義是Fayyad 等給出的:KDD是從數據集中識別出有效的、新穎的、潛在有用的以及最終可理解模式的高級處理過程。從定義可以看出,數據挖掘(DataMining)就是從大量的、不完全的、有雜訊的、模糊的、隨機的數據中,提取隱含在其中的、人們事先不知道的、但又是潛在有用的信息和知識的過程。人們把原始數據看作是形成知識的源泉,就像從礦石中采礦一樣。原始數據可以是結構化的,如關系資料庫中的數據,也可以是半結構化的,如文本、圖形、圖像數據,甚至是分布在網路上的異構型數據。發現知識的方法可以是數學的,也可以是非數學的;可以是演繹的,也可以是歸納的。發現了的知識可以被用於信息管理、查詢優化、決策支持、過程式控制制等,還可以用於數據自身的維護。因此,數據挖掘是一門很廣義的交叉學科,它匯聚了不同領域的研究者,尤其是資料庫、人工智慧、數理統計、可視化、並行計算等方面的學者和工程技術人員。
特別要指出的是,數據挖掘技術從一開始就是面向應用的。它不僅是面向特定資料庫的簡單檢索查詢調用,而且要對這些數據進行微觀、中觀乃至宏觀的統計、分析、綜合和推理,以指導實際問題的求解,企圖發現事件間的相互關聯,甚至利用已有的數據對未來的活動進行預測。
一般來說在科研領域中稱為KDD,而在工程領域則稱為數據挖掘。
二、數據挖掘的步驟
KDD包括以下步驟:
1、數據准備
KDD的處理對象是大量的數據,這些數據一般存儲在資料庫系統中,是長期積累的結果。但往往不適合直接在這些數據上面進行知識挖 掘,需要做數據准備工作,一般包括數據的選擇(選擇相關的數據)、凈化(消除噪音、冗餘數據)、推測(推算缺失數據)、轉換(離散值 數據與連續值數據之間的相互轉換,數據值的分組分類,數據項之間的計算組合等)、數據縮減(減少數據量)。如果KDD的對象是數據倉 庫,那麼這些工作往往在生成數據倉庫時已經准備妥當。數據准備是KDD 的第一個步驟,也是比較重要的一個步驟。數據准備是否做好將影 響到數據挖掘的效率和准確度以及最終模式的有效性。
2、數據挖掘
數據挖掘是KDD最關鍵的步驟,也是技術難點所在。研究KDD的人員中大部分都在研究數據挖掘技術,採用較多的技術有決策樹、分類、 聚類、粗糙集、關聯規則、神經網路、遺傳演算法等。數據挖掘根據KDD的目標,選取相應演算法的參數,分析數據,得到可能形成知識的模式 模型。
3、評估、解釋模式模型
上面得到的模式模型,有可能是沒有實際意義或沒有實用價值的,也有可能是其不能准確反映數據的真實意義,甚至在某些情況下是與事 實相反的,因此需要評估,確定哪些是有效的、有用的模式。評估可以根據用戶多年的經驗,有些模式也可以直接用數據來檢驗其准確性。 這個步驟還包括把模式以易於理解的方式呈現給用戶。
4、鞏固知識
用戶理解的、並被認為是符合實際和有價值的模式模型形成了知識。同時還要注意對知識做一
致性檢查,解決與以前得到的知識互相沖 突、矛盾的地方,使知識得到鞏固。
5、運用知識
發現知識是為了運用,如何使知識能被運用也是KDD的步驟之一。運用知識有兩種方法:一種是只需看知識本身所描述的關系或結果,就 可以對決策提供支持;另一種是要求對新的數據運用知識,由此可能產生新的問題,而需要對知識做進一步的優化
三、數據挖掘的特點及功能
3.1、數據挖掘的特點
數據挖掘具有如下幾個特點,當然,這些特點與數據挖掘要處理的數據和目的是密切相關的。
1、處理的數據規模十分巨大。
2、查詢一般是決策制定者(用戶)提出的即時隨機查詢,往往不能形成精確的查詢要求。
3、由於數據變化迅速並可能很快過時,因此需要對動態數據作出快速反應,以提供決策支持。
4、主要基於大樣本的統計規律,其發現的規則不一定適用於所有數據
3.2、數據挖掘的功能
數據挖掘所能發現的知識有如下幾種:
廣義型知識,反映同類事物共同性質的知識;
特徵型知識,反映事物各方面的特徵知識;
差異型知識,反映不同事物之間屬性差別的知識 ;關聯型知識,反映事物之間依賴或關聯的知識;
預測型知識,根據歷史的和當前的數據推測未來數據;偏離型知識,揭示事物偏離常規的異常現象。
所有這些知識都可以在不同的概念層次上被發現,隨著概念樹的提升,從微觀到中觀再到宏觀,以滿足不同用戶、不同層次決策的需要。例如,從一家超市的數據倉庫中,可以發現的一條典型關聯規則可能是」買麵包和黃油的顧客十有八九也買牛奶」,也可能是」買食品的顧客幾乎都用信用卡」,這種規則對於商家開發和實施客戶化的銷售計劃和策略是非常有用的。至於發現工具和方法,常用的有分類、聚類、減維、模式識別、可視化、決策樹、遺傳演算法、不確定性處理等。歸納起來,數據挖掘有如下幾個功能:
預測/驗證功能:預測/驗證功能指用資料庫的若干已知欄位預測或驗證其他未知欄位值。預測方法有統計分析方法、關聯規則和決策樹預測方法、回歸樹預測方法等。
描述功能:描述功能指找到描述數據的可理解模式。描述方法包括以下幾種:數據分類、回歸分析、簇聚、概括、構造依賴模式、變化和偏差分析、模式發現、路徑發現等。
四、數據挖掘的模式
數據挖掘的任務是從數據中發現模式。模式是一個用語言L來表示的一個表達式E,它可用來描述數據集F中數據的特性,E 所描述的數據是集 合F的一個子集FE。E作為一個模式要求它比列舉數據子集FE中所有元素的描述方法簡單。例如,「如果成績在81 ~90之間,則成績優良」可稱 為一個模式,而「如果成績為81、82、83、84、85、86、87、88、89 或90,則成績優良」就不能稱之為一個模式。
模式有很多種,按功能可分有兩大類:預測型(Predictive)模式和描述型(Descriptive)模式。
預測型模式是可以根據數據項的值精確確定某種結果的模式。挖掘預測型模式所使用的數據也都是可以明確知道結果的。例如,根據各種 動物的資料,可以建立這樣的模式:凡是胎生的動物都是哺乳類動物。當有新的動物資料時,就可以根據這個模式判別此動物是否是哺乳動物。
描述型模式是對數據中存在的規則做一種描述,或者根據數據的相似性把數據分組。描述型模式不能直接用於預測。例如,在地球上,70 %的表面被水覆蓋,30 %是土地。
在實際應用中,往往根據模式的實際作用細分為以下6 種:
1、分類模式
分類模式是一個分類函數( 分 類 器),能夠把數據集中的數據項映射到某個給定的類上。分類模式往往表現為一棵分類樹,根據數據的 值從樹根開始搜索,沿著數據滿足的分支往上走,走到樹葉就能確定類別。
2、回歸模式
回歸模式的函數定義與分類模式相似,它們的差別在於分類模式的預測值是離散的,回歸模式的預測值是連續的。如給出某種動物的特徵,可以用分類模式判定這種動物是哺乳動物還是鳥類;給出某個人的教育情況、工作經驗,可以用回歸模式判定這個人的年工資在哪個范圍內,是在6000元以下,還是在6000元到1萬元之間,還是在1萬元以上。
3、時間序列模式
時間序列模式根據數據隨時間變化的趨勢預測將來的值。這里要考慮到時間的特殊性質,像一些周期性的時間定義如星期、月、季節、年 等,不同的日子如節假日可能造成的影響,日期本身的計算方法,還有一些需要特殊考慮的地方如時間前後的相關性(過去的事情對將來有 多大的影響力)等。只有充分考慮時間因素,利用現有數據隨時間變化的一系列的值,才能更好地預測將來的值。
4、聚類模式
聚類模式把數據劃分到不同的組中,組之間的差別盡可能大,組內的差別盡可能小。與分類模式不同,進行聚類前並不知道將要劃分成幾 個組和什麼樣的組,也不知道根據哪一(幾)個數據項來定義組。一般來說,業務知識豐富的人應該可以理解這些組的含義,如果產生的模式無法理解或不可用,則該模式可能是無意義的,需要回到上階段重新組織數據。
5、關聯模式
關聯模式是數據項之間的關聯規則。關聯規則是如下形式的一種規則:「在無力償還貸款的人當中,60%的人的月收入在3000元以下。」
6、序列模式
序列模式與關聯模式相仿,而把數據之間的關聯性與時間聯系起來。為了發現序列模式,不僅需要知道事件是否發生,而且需要確定事件 發生的時間。例如,在購買彩電的人們當中,60%的人會在3個月內購買影碟機
五、數據挖掘的發現任務
數據挖掘涉及的學科領域和方法很多,有多種分類法。根據挖掘任務分,可分為分類或預測模型發現、數據總結、聚類、關聯規則發現、序列模式發現、依賴關系或依賴模型發現、異常和趨勢發現等等;根據挖掘對象分,有關系資料庫、面向對象資料庫、空間資料庫、時態資料庫、文本數據源、多媒體資料庫、異質資料庫、遺產資料庫以及環球網Web;根據挖掘方法分,可粗分為:機器學習方法、統計方法、神經網路方法和資料庫方法。機器學習中,可細分為:歸納學習方法(決策樹、規則歸納等)、基於範例學習、遺傳演算法等。統計方法中,可細分為:回歸分析(多元回歸、自回歸等)、判別分析(貝葉斯判別、費歇爾判別、非參數判別等)、聚類分析(系統聚類、動態聚類等)、探索性分析(主元分析法、相關分析法等)等。神經網路方法中,可細分為:前向神經網路(BP演算法等)、自組織神經網路(自組織特徵映射、競爭學習等)等。資料庫方法主要是多維數據分析或OLAP 方法,另外還有面向屬性的歸納方法。
從挖掘任務和挖掘方法的角度而言有數據總結、分類發現、聚類和關聯規則發現四種非常重要的發現任務。
5.1、數據總結
數據總結目的是對數據進行濃縮,給出它的緊湊描述。傳統的也是最簡單的數據總結方法是計算出資料庫的各個欄位上的求和值、平均值、方差值等統計值,或者用直方圖、餅狀圖等圖形方式表示。數據挖掘主要關心從數據泛化的角度來討論數據總結。數據泛化是一種把資料庫中的有關數據從低層次抽象到高層次上的過程。由於資料庫上的數據或對象所包含的信息總是最原始、基本的信息(這是為了不遺漏任何可能有用的數據信息)。人們有時希望能從較高層次的視圖上處理或瀏覽數據,因此需要對數據進行不同層次上的泛化以適應各種查詢要求。數據泛化目前主要有兩種技術:多維數據分析方法和面向屬性的歸納方法。
1、多維數據分析方法是一種數據倉庫技術,也稱作聯機分析處理(OLAP)。數據倉庫是面向決策支持的、集成的、穩定的、不同時間的歷史數據集合。決策的前提是數據分析。在數據分析中經常要用到諸如求和、總計、平均、最大、最小等匯集操作,這類操作的計算量特別大。因此一種很自然的想法是,把匯集操作結果預先計算並存儲起來,以便於決策支持系統使用。存儲匯集操作結果的地方稱作多維資料庫。多維數據分析技術已經在決策支持系統中獲得了成功的應用,如著名的SAS數據分析軟體包、Business Object公司的決策支持系統Business Object,以及IBM公司的決策分析工具都使用了多維數據分析技術。
採用多維數據分析方法進行數據總結,它針對的是數據倉庫,數據倉庫存儲的是離線的歷史數據。
2、為了處理聯機數據,研究人員提出了一種面向屬性的歸納方法。它的思路是直接對用戶感興趣的數據視圖(用一般的SQL查詢語言即可獲得)進行泛化,而不是像多維數據分析方法那樣預先就存儲好了泛化數據。方法的提出者對這種數據泛化技術稱之為面向屬性的歸納方法。原始關系經過泛化操作後得到的是一個泛化關系,它從較高的層次上總結了在低層次上的原始關系。有了泛化關系後,就可以對它進行各種深入的操作而生成滿足用戶需要的知識,如在泛化關系基礎上生成特性規則、判別規則、分類規則,以及關聯規則等。
5.2、分類發現
分類在數據挖掘中是一項非常重要的任務,目前在商業上應用最多。分類的目的是學會一個分類函數或分類模型(也常常稱作分類器),該模型能把資料庫中的數據項映射到給定類別中的某一個。分類和回歸都可用於預測。預測的目的是從利用歷史數據紀錄中自動推導出對給定數據的推廣描述,從而能對未來數據進行預測。和回歸方法不同的是,分類的輸出是離散的類別值,而回歸的輸出則是連續數值。
要構造分類器,需要有一個訓練樣本數據集作為輸入。訓練集由一組資料庫記錄或元組構成,每個元組是一個由有關欄位(又稱屬性或特徵)值組成的特徵向量,此外,訓練樣本還有一個類別標記。一個具體樣本的形式可為:( v1, v2, …, vn; c );其中vi表示欄位值,c表示類別。
分類器的構造方法有統計方法、機器學習方法、神經網路方法等等。統計方法包括貝葉斯法和非參數法(近鄰學習或基於事例的學習),對應的知識表示則為判別函數和原型事例。機器學習方法包括決策樹法和規則歸納法,前者對應的表示為決策樹或判別樹,後者則一般為產生式規則。神經網路方法主要是BP演算法,它的模型表示是前向反饋神經網路模型(由代表神經元的節點和代表聯接權值的邊組成的一種體系結構),BP演算法本質上是一種非線性判別函數。另外,最近又興起了一種新的方法:粗糙集(rough set),其知識表示是產生式規則。
不同的分類器有不同的特點。有三種分類器評價或比較尺度:1 預測准確度;2 計算復雜度;3 模型描述的簡潔度。預測准確度是用得最多的一種比較尺度,特別是對於預測型分類任務,目前公認的方法是10番分層交叉驗證法。計算復雜度依賴於具體的實現細節和硬體環境,在數據挖掘中,由於操作對象是巨量的資料庫,因此空間和時間的復雜度問題將是非常重要的一個環節。對於描述型的分類任務,模型描述越簡潔越受歡迎;例如,採用規則表示的分類器構造法就更有用,而神經網路方法產生的結果就難以理解。
另外要注意的是,分類的效果一般和數據的特點有關,有的數據雜訊大,有的有缺值, 有的分布稀疏,有的欄位或屬性間相關性強,有的屬性是離散的而有的是連續值或混合式的。目前普遍認為不存在某種方法能適合於各種特點的數據。
5.3、聚類
聚類是把一組個體按照相似性歸成若干類別,即」物以類聚」。它的目的是使得屬於同一類別的個體之間的距離盡可能的小,而不同類別上的個體間的距離盡可能的大。聚類方法包括統計方法、機器學習方法、神經網路方法和面向資料庫的方法。
在統計方法中,聚類稱聚類分析,它是多元數據分析的三大方法之一(其它兩種是回歸分析和判別分析)。它主要研究基於幾何距離的聚類,如歐式距離、明考斯基距離等。傳統的統計聚類分析方法包括系統聚類法、分解法、加入法、動態聚類法、有序樣品聚類、有重疊聚類和模糊聚類等。這種聚類方法是一種基於全局比較的聚類,它需要考察所有的個體才能決定類的劃分;因此它要求所有的數據必須預先給定,而不能動態增加新的數據對象。聚類分析方法不具有線性的計算復雜度,難以適用於資料庫非常大的情況。
在機器學習中聚類稱作無監督或無教師歸納;因為和分類學習相比,分類學習的例子或數據對象有類別標記,而要聚類的例子則沒有標記,需要由聚類學習演算法來自動確定。很多人工智慧文獻中,聚類也稱概念聚類;因為這里的距離不再是統計方法中的幾何距離 ,而是根據概念的描述來確定的。當聚類對象可以動態增加時,概念聚類則稱是概念形成。
在神經網路中,有一類無監督學習方法:自組織神經網路方法;如Kohonen自組織特徵映射網路、競爭學習網路等等。在數據挖掘領域里,見報道的神經網路聚類方法主要是自組織特徵映射方法,IBM在其發布的數據挖掘白皮書中就特別提到了使用此方法進行資料庫聚類分割。
5.4、關聯規則發現
關聯規則是形式如下的一種規則,」在購買麵包和黃油的顧客中,有90%的人同時也買了牛奶」(麵包+黃油 ( 牛奶 )。用於關聯規則發現的主要對象是事務型資料庫,其中針對的應用則是售貨數據,也稱貨籃數據。一個事務一般由如下幾個部分組成:事務處理時間 ,一組顧客購買的物品,有時也有顧客標識號(如信用卡號)。
由於條形碼技術的發展,零售部門可以利用前端收款機收集存儲大量的售貨數據。因此,如果對這些歷史事務數據進行分析,則可對顧客的購買行為提供極有價值的信息。例如,可以幫助如何擺放貨架上的商品(如把顧客經常同時買的商品放在一起),幫助如何規劃市場(怎樣相互搭配進貨)。由此可見,從事務數據中發現關聯規則,對於改進零售業等商業活動的決策非常重要。
如果不考慮關聯規則的支持度和可信度,那麼在事務資料庫中存在無窮多的關聯規則。事實上,人們一般只對滿足一定的支持度和可信度的關聯規則感興趣。在文獻中,一般稱滿足一定要求的(如較大的支持度和可信度)的規則為強規則。因此,為了發現出有意義的關聯規則,需要給定兩個閾值:最小支持度和最小可信度。前者即用戶規定的關聯規則必須滿足的最小支持度,它表示了一組物品集在統計意義上的需滿足的最低程度;後者即用戶規定的關聯規則必須滿足的最小可信度,它反應了關聯規則的最低可靠度。
在實際情況下,一種更有用的關聯規則是泛化關聯規則。因為物品概念間存在一種層次關系,如夾克衫、滑雪衫屬於外套類,外套、襯衣又屬於衣服類。有了層次關系後,可以幫助發現一些更多的有意義的規則。例如,」買外套,買鞋子」(此處,外套和鞋子是較高層次上的物品或概念,因而該規則是一種泛化的關聯規則)。由於商店或超市中有成千上萬種物品,平均來講,每種物品(如滑雪衫)的支持度很低,因此有時難以發現有用規則;但如果考慮到較高層次的物品(如外套),則其支持度就較高,從而可能發現有用的規則。另外,關聯規則發現的思路還可以用於序列模式發現。用戶在購買物品時,除了具有上述關聯規律,還有時間上或序列上的規律,因為,很多時候顧客會這次買這些東西,下次買同上次有關的一些東西,接著又買有關的某些東西。
Ⅳ 資料庫都有哪些
一、資料庫種類有哪些
早期較為時興的資料庫種類有三種,分別是層次式資料庫、網路式資料庫和關系型資料庫。而在如今的互聯網中,最常見的資料庫種類主要有2種,即關系型資料庫和非關系型資料庫。
二、層次資料庫介紹
層次資料庫是最開始研製的資料庫系統軟體,它把數據根據層次構造(樹結構)的方法呈現。層次資料庫以前是非常熱門的資料庫,但伴隨著關系資料庫的逐漸流行,如今早已非常少應用了。
較為具備象徵性的層次資料庫是IMS(Information Management System)資料庫,由IBM企業研發。
三、關系型資料庫詳細介紹
網路資料庫和層次資料庫在數據獨立性和抽象性級別上有所欠缺,用戶開展存儲時,需要聲明數據的存儲結構和相對路徑。而關系資料庫就可以較切實解決這種問題。
和Excel工作簿一樣,關系型資料庫也選用由列和行構成的二維表來管理數據,簡單易懂。另外,它還利用SQL(Structured Query Language,結構化查詢語言)對數據開展實際操作。
四、非關系型資料庫詳細介紹
伴隨著互聯網技術Web2.0的興起,傳統關系型資料庫在應對大數據量,比如大規模和高並發的微博、微信或者SNS類型的web2.0動態網頁時,已經有些力不從心,曝露了許多難以克服的難題。因此出現了針對大規模數據量場景,以性能卓越和應用便捷為目的的的資料庫產品——NOSQL資料庫。
Ⅳ 1. SQL Server 2000為用戶提供模板和原型的資料庫是( )。 A. master B. model C. msdb D. tempdb
BAADDBDCAB
1MB
master
ndf
日誌
sp_renamedb
Ⅵ 資料庫都有哪些
資料庫是一組信息的集合,以便可以方便地訪問、管理和更新,常用資料庫有:1、關系型資料庫;2、分布式資料庫;3、雲資料庫;4、NoSQL資料庫;5、面向對象的資料庫;6、圖形資料庫。
計算機資料庫通常包含數據記錄或文件的聚合,例如銷售事務、產品目錄和庫存以及客戶配置文件。
通常,資料庫管理器為用戶提供了控制讀寫訪問、指定報表生成和分析使用情況的能力。有些資料庫提供ACID(原子性、一致性、隔離性和持久性)遵從性,以確保數據的一致性和事務的完整性。
資料庫普遍存在於大型主機系統中,但也存在於較小的分布式工作站和中端系統中,如IBM的as /400和個人計算機。
資料庫的演變
資料庫從1960年代開始發展,從層次資料庫和網路資料庫開始,到1980年代的面向對象資料庫,再到今天的SQL和NoSQL資料庫和雲資料庫。
一種觀點認為,資料庫可以按照內容類型分類:書目、全文、數字和圖像。在計算中,資料庫有時根據其組織方法進行分類。有許多不同類型的資料庫,從最流行的方法關系資料庫到分布式資料庫、雲資料庫或NoSQL資料庫。
常用資料庫:
1、關系型資料庫
關系型資料庫是由IBM的E.F. Codd於1970年發明的,它是一個表格資料庫,其中定義了數據,因此可以以多種不同的方式對其進行重組和訪問。
關系資料庫由一組表組成,其中的數據屬於預定義的類別。每個表在一個列中至少有一個數據類別,並且每一行對於列中定義的類別都有一個特定的數據實例。
結構化查詢語言(SQL)是關系資料庫的標准用戶和應用程序介面。關系資料庫易於擴展,並且可以在原始資料庫創建之後添加新的數據類別,而不需要修改所有現有應用程序。
2、分布式資料庫
分布式資料庫是一種資料庫,其中部分資料庫存儲在多個物理位置,處理在網路中的不同點之間分散或復制。
分布式資料庫可以是同構的,也可以是異構的。同構分布式資料庫系統中的所有物理位置都具有相同的底層硬體,並運行相同的操作系統和資料庫應用程序。異構分布式資料庫中的硬體、操作系統或資料庫應用程序在每個位置上可能是不同的。
3、雲資料庫
雲資料庫是針對虛擬化環境(混合雲、公共雲或私有雲)優化或構建的資料庫。雲資料庫提供了一些好處,比如可以按每次使用支付存儲容量和帶寬的費用,還可以根據需要提供可伸縮性和高可用性。
雲資料庫還為企業提供了在軟體即服務部署中支持業務應用程序的機會。
4、NoSQL資料庫
NoSQL資料庫對於大型分布式數據集非常有用。
NoSQL資料庫對於關系資料庫無法解決的大數據性能問題非常有效。當組織必須分析大量非結構化數據或存儲在雲中多個虛擬伺服器上的數據時,它們是最有效的。
5、面向對象的資料庫
使用面向對象編程語言創建的項通常存儲在關系資料庫中,但是面向對象資料庫非常適合於這些項。
面向對象的資料庫是圍繞對象(而不是操作)和數據(而不是邏輯)組織的。例如,關系資料庫中的多媒體記錄可以是可定義的數據對象,而不是字母數字值。
6、圖形資料庫
面向圖形的資料庫是一種NoSQL資料庫,它使用圖形理論存儲、映射和查詢關系。圖資料庫基本上是節點和邊的集合,其中每個節點表示一個實體,每個邊表示節點之間的連接。
圖形資料庫在分析互連方面越來越受歡迎。例如,公司可以使用圖形資料庫從社交媒體中挖掘關於客戶的數據。
訪問資料庫:DBMS和RDBMS
資料庫管理系統(DBMS)是一種允許您定義、操作、檢索和管理存儲在資料庫中的數據的軟體。
關系資料庫管理系統(RDBMS)是上世紀70年代開發的一種基於關系模型的資料庫管理軟體,目前仍然是最流行的資料庫管理方法。
Microsoft SQL Server、Oracle資料庫、IBM DB2和MySQL是企業用戶最常用的RDBMS產品。DBMS技術始於20世紀60年代,支持分層資料庫,包括IBM的信息管理系統和CA的集成資料庫管理系統。一個關系資料庫管理系統(RDBMS)是一種資料庫管理軟體是在20世紀70年代開發的,基於關系模式,仍然是管理資料庫的最普遍的方式。
希望能幫助你還請及時採納謝謝