關系型數據庫,常見的四種關系型數據庫
關系型數據庫有哪些啊,關系型數據庫包括MySQL、PostgreSQL、Oracle、Microsoft SQL Server、Microsoft Access、SQLite等。這些數據庫都遵循關系模型,將數據存儲在表格中,并通過表格之間的關聯 關系型數據庫包括MySQL、PostgreSQL、Oracle、Microsoft SQL Server、Microsoft Access、SQLite等。這些數據庫都遵循關系模型,將數據存儲在表格中,并通過表格之間的關聯 這些數據庫都遵循關系模型,將數據存儲在表格中,并通過表格之間的關聯來建立數據之間的關系。關系型數據庫廣泛應用于各種行業,包括金融、醫療、零售、政府等。
關系型數據庫,常見的四種關系型數據庫
相信您和我一樣,在使用關系型數據庫時常常會遇到一系列非常復雜的設計問題。例如一部**中的各個演員常常有主角配角之分,還要有導演,特效等人員的參與。通常情況下這些人員常常都被抽象為Person類型,對應著同一個數據庫表。同時一位導演本身也可以是其它**或者電視劇的演員,更可能是歌手,甚至是某些影視公司的投資者(沒錯,我這個例子的確是以趙薇為模板的)。而這些影視公司則常常是一系列**,電視劇的資方。這種彼此關聯的關系常常會非常復雜,而且在兩個實體之間常常同時存在著多個不同的關系:
在嘗試使用關系型數據庫對這些關系進行建模時,我們首先需要建立表示各種實體的一系列表:表示人的表,表示**的表,表示電視劇的表,表示影視公司的表等等。這些表常常需要通過一系列關聯表將它們關聯起來:通過這些關聯表來記錄一個人到底參演過哪些**,參演過哪些電視劇,唱過哪些歌,同時又是哪些公司的投資方。同時我們還需要創建一系列關聯表來記錄一部**中哪些人是主角,哪些人是配角,哪個人是導演,哪些人是特效等??梢钥吹?,我們需要大量的關聯表來記錄這一系列復雜的關系。在更多實體引入之后,我們將需要越來越多的關聯表,從而使得基于關系型數據庫的解決方案繁瑣易錯。
這一切的癥結主要在于關系型數據庫是以為實體建模這一基礎理念設計的。該設計理念并沒有提供對這些實體間關系的直接支持。在需要描述這些實體之間的關系時,我們常常需要創建一個關聯表以記錄這些數據之間的關聯關系,而且這些關聯表常常不用來記錄除外鍵之外的其它數據。也就是說,這些關聯表也僅僅是通過關系型數據庫所已有的功能來模擬實體之間的關系。這種模擬導致了兩個非常糟糕的結果:數據庫需要通過關聯表間接地維護實體間的關系,導致數據庫的執行效能低下;同時關聯表的數量急劇上升。
這種執行效能到底低下到什么程度呢?就以建立人和**之間的投資關系為例。一個使用關聯表的設計常常如下所示:
如果現在我們想要通過該關系找到一部**的所有投資人,關系型數據庫常常會執行哪些操作呢?首先,在關聯表中執行一個Table Scan操作(假設沒有得到索引支持),以找到所有film域的值與目標**id相匹配的記錄。接下來,通過這些記錄中的person域所記錄的Person的主鍵值來從Person表中找到相應的記錄。如果記錄較少,那么這步就會使用Clustered Index Seek操作(假設是使用該運算符)。整個操作的時間復雜度將變為O(nlogn):
可以看到,通過關聯表組織的關系在運行時的性能并不是很好。如果我們所需要操作的數據集包含了非常多的關系,而且主要是在對這些關系進行操作,那么可以想象到關系數據庫的性能將變得有多差。
除了性能之外,關聯表數量的管理也是一個非常讓人頭疼的問題。剛剛我們僅僅是舉了一個具有四個實體的例子:人,**,電視劇,影視公司?,F實生活中的例子可不是這么簡單。在一些場景下,我們常常需要對更多的實體進行建模,從而完整地描述某一領域內的關聯關系。這種關聯關系所涵蓋的可能包含影視公司的控股關系,各控股公司之間復雜的持股關系以及各公司之間的借貸款情況及擔保關系等,更可能是人之間的關系,人與各個品牌之間的代言關系,各個品牌與所屬公司之間的關系等。
可以看到,在需要描述大量關系時,傳統的關系型數據庫已經不堪重負。它所能承擔的是較多實體但是實體間關系略顯簡單的情況。而對于這種實體間關系非常復雜,常常需要在關系之中記錄數據,而且大部分對數據的操作都與關系有關的情況,原生支持了關系的圖形數據庫才是正確的選擇。它不僅僅可以為我們帶來運行性能的提升,更可以大大提高系統開發效率,減少維護成本。
在一個圖形數據庫中,數據庫的最主要組成主要有兩種,結點集和連接結點的關系。結點集就是圖中一系列結點的集合,比較接近于關系數據庫中所最常使用的表。而關系則是圖形數據庫所特有的組成。因此對于一個習慣于使用關系型數據庫開發的人而言,如何正確地理解關系則是正確使用圖形數據庫的關鍵。
但是不用擔心,在了解了圖形數據庫對數據進行抽象的方式之后,您就會覺得這些數據抽象方式實際上和關系型數據庫還是非常接近的。簡單地說,每個結點仍具有標示自己所屬實體類型的標簽,也既是其所屬的結點集,并記錄一系列描述該結點特性的屬性。除此之外,我們還可以通過關系來連接各個結點。因此各個結點集的抽象實際上與關系型數據庫中的各個表的抽象還是有些類似的:
但是在表示關系的時候,關系型數據庫和圖形數據庫就有很大的不同了:
從上圖中可以看到,在需要表示多對多關系時,我們常常需要創建一個關聯表來記錄不同實體的多對多關系,而且這些關聯表常常不用來記錄信息。如果兩個實體之間擁有多種關系,那么我們就需要在它們之間創建多個關聯表。而在一個圖形數據庫中,我們只需要標明兩者之間存在著不同的關系,例如用DirectBy關系指向**的導演,或用ActBy關系來指定參與**拍攝的各個演員。同時在ActBy關系中,我們更可以通過關系中的屬性來表示其是否是該**的主演。而且從上面所展示的關系的名稱上可以看出,關系是有向的。如果希望在兩個結點集間建立雙向關系,我們就需要為每個方向定義一個關系。
也就是說,相對于關系數據庫中的各種關聯表,圖形數據庫中的關系可以通過關系能夠包含屬性這一功能來提供更為豐富的關系展現方式。因此相較于關系型數據庫,圖形數據庫的用戶在對事物進行抽象時將擁有一個額外的武器,那就是豐富的關系:
因此在為圖形數據庫定義數據展現時,我們應該以一種更為自然的方式來對這些需要展現的事物進行抽象:首先為這些事物定義其所對應的結點集,并定義該結點集所具有的各個屬性。接下來辨識出它們之間的關系并創建這些關系的相應抽象。
因此一個圖形數據庫中所承載的數據最終將有類似于下圖所示的結構:
設計一個優質的圖
在了解了圖形數據庫的基礎知識之后,我們就要開始嘗試使用圖形數據庫了。首先我們要搞清楚一個問題,那就是如何為我們的圖形數據庫定義一個設計良好的圖?實際上這并不困難,您只需要了解圖數據庫設計時所使用的一系列要點即可。
首先就是,分清圖中結點集,結點以及關系之間的相互聯系。在以往的基于關系型數據庫的設計中,我們常常會使用一個表來抽象一類事物。如對于人這個概念,我們常常會抽象出一個表,并在表中添加表示兩個人的記錄,Alice和Bob:
而在圖數據庫中,這里對應著兩個概念:結點集和結點。在通常情況下,圖形數據庫中的數據展示并不使用結點集,而是獨立的結點:
而如果需要在圖中添加對書籍的支持,那么這些書籍將仍然被表示為一個結點:
也就是說,雖然在一個圖數據庫中常常擁有結點集的概念,但是它已經不再作為圖數據庫的最重要抽象方式了。甚至從某些圖形數據庫已經允許軟件開發人員使用Schemaless結點這一點上來看,它們已經將結點集的概念弱化了。反過來,我們思考的角度就應該是結點個體,以及這些個體之間所存在的一系列關系。
那么我們是不是可以隨便定義各個結點所具有的數據呢?不是的。這里最為常用的一個準則就是:Schemaless這種靈活度能為你帶來好處。例如相較于強類型語言,弱類型語言可以為軟件開發人員帶來更大的開發靈活度,但是其維護性和嚴謹性常常不如強類型語言。同樣地,在使用Schemaless結點時也要兼顧靈活性和維護性。
這樣我們就可以在結點中添加多種多樣的關系,而不用像在關系型數據庫中那樣需要擔心是否需要通過更改數據庫的Schema來記錄一些外鍵。這進而允許軟件開發人員在各結點間添加多種多樣的關系:
因此在一個圖形數據庫中,結點集這個概念已經不是最重要的那一類概念了。例如在某些圖形數據庫中,各個結點的ID并不是按照結點集來組織的,而是根據結點的創建順序來賦予的。在調試時您可能會發現,某個結點集內的第一個結點的ID是1,第二個結點的ID就是3了。而具有2這個ID的結點則處于另一個結點集中。
那么我們應該如何為業務邏輯定義一個合適的圖呢?簡單地說,單一事物應該被抽象為一個結點,而同一類型的結點被記錄在同一個結點集中。結點集內各結點所包含的數據可能有一些不同,如一個人可能有不同的職責并由此通過不同的關系和其它結點關聯。例如一個人既可能是演員,可能是導演,也可能是演員兼導演。在關系型數據庫中,我們可能需要為演員和導演建立不同的表。而在圖形數據庫中,這三種類型的人都是人這個結點集內的數據,而不同的僅僅是它們通過不同的關系連接到不同的結點上了而已。也就是說,在圖形數據庫中,結點集并不會像關系型數據庫中的表一樣粒度那么小。
一旦抽象出了各個結點集,我們就需要找出這些結點之間所可能擁有的關系。這些關系不僅僅是跨結點集的。有時候,這些關系是同一結點集內的結點之間的關系,甚至是同一結點指向自身的關系:
這些關系通常都具有一個起點和終點。也就是說,圖形數據庫中的關系常常是有向的。如果希望在兩個結點之間創建一個相互關系,如Alice和Bob彼此相識,我們就需要在他們之間創建兩個KNOW_ABOUT關系。其中一個關系由Alice指向Bob,而另一個關系則由Bob指向Alice:
需要注意的一點就是,雖然說圖形數據庫中的關系是單向的,但是在一些圖形數據庫的實現中,如Neo4J,我們不僅僅可以查找到從某個結點所發出的關系,也可以找到指向某個結點的各個關系。也就是說,雖然圖中的關系是單向的,但是關系在起點和終點都可以被查找到。
請列出關系型數據庫的三種算法,很多了..關系型的有:SQLServer、Sybase、Informixmysql .等等..實時的我知道的有:Lotus Notes..包括XML也可以做為實時數據庫的. 很多了..關系型的有:SQLServer、Sybase、Informixmysql .等等..實時的我知道的有:Lotus Notes..包括XML也可以做為實時數據庫的.關系型數據庫標準形式,關系型數據庫標準形是指采用了關系模型來組織數據的數據庫,其以行和列的形式存儲數據,以便于用戶理解,關系型數據庫這一系列的行和列被稱為表,一組表組成了數據庫。用戶 關系型數據庫標準形是指采用了關系模型來組織數據的數據庫,其以行和列的形式存儲數據,以便于用戶理解,關系型數據庫這一系列的行和列被稱為表,一組表組成了數據庫。用戶 用戶通過查詢來檢索數據庫中的數據,而查詢是一個用于限定數據庫中某些區域的執行代碼。
版權聲明: 本站僅提供信息存儲空間服務,旨在傳遞更多信息,不擁有所有權,不承擔相關法律責任,不代表本網贊同其觀點和對其真實性負責。如因作品內容、版權和其它問題需要同本網聯系的,請發送郵件至 舉報,一經查實,本站將立刻刪除。