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