數(shù)據(jù)庫是一個程序,幫助管理數(shù)據(jù)用的碧浊。那么管理數(shù)據(jù)會面對哪些挑戰(zhàn)呢兜挨?
- 數(shù)據(jù)在磁盤上可以高效管理的組織方式
- 并發(fā)時能保證ACID(因為很多系統(tǒng)對ACID的需求不那么嚴(yán)格退唠,所以出現(xiàn)了某些NOSQL提出的最終一致性的調(diào)整)
- 在程序運行到任何一步發(fā)生斷電/系統(tǒng)崩潰后,能恢復(fù)且保證ACID
- 分布式ACID
- 使用內(nèi)存提高數(shù)據(jù)管理性能窜醉,但仍要保證ACID的前提
- 方便使用
說白了宪萄,就是在保證ACID(數(shù)據(jù)正確性)的前提下,對數(shù)據(jù)進(jìn)行管理的程序酱虎。我提到了很多次ACID雨膨,具體就不展開來講,網(wǎng)上有很多相關(guān)資料读串。無論怎么解讀聊记,其實就是在說保證數(shù)據(jù)的正確性這個議題。
如果要展開說恢暖,數(shù)據(jù)庫的內(nèi)容就很多了排监,我這里就簡要地提幾個關(guān)鍵的地方,短短幾句話不可能面面俱到杰捂,請不要在意行文細(xì)節(jié)上的邏輯漏洞舆床。
- 行級別的約束,比如性別(男/女)嫁佳,如果一個叫“火車”的性別記錄到數(shù)據(jù)庫里挨队,那這個記錄就失去了準(zhǔn)確性了。
- 表級的約束蒿往,比如唯一約束uniq盛垦。
- 跨表級的約束,比如外鍵瓤漏,例如一個學(xué)校有Bob/Lob兩位班主任腾夯,那通過外鍵可以約束A班的班主任只能是Bob或是Lob颊埃。同時也能約束這個系統(tǒng)不能失去班主任Bob和Lob的信息,除非他們已經(jīng)不屬于任何一個班級了蝶俱。
- 所有針對數(shù)據(jù)的改變都要落到磁盤上班利,大部分?jǐn)?shù)據(jù)庫的做法都是所有的修改都追加寫入日志文件而不是直接修改存放數(shù)據(jù)的文件。這樣就能做到回滾榨呆、斷電保護(hù)等效果罗标。
- 提高查詢速度的內(nèi)存緩存,數(shù)據(jù)庫會把磁盤上的數(shù)據(jù)放入內(nèi)存進(jìn)行緩存积蜻,如果已經(jīng)緩存好了馒稍,就不會再去磁盤上讀了。雖然是緩存浅侨,仍不能拋棄ACID,這比平時用的如memcache等的緩存要求要嚴(yán)格得多证膨。
- 提高查詢速度的索引如输,數(shù)據(jù)庫在進(jìn)行很多操作的時候,都可以藉由索引提高速度央勒,比如查詢時select a where b = 1(b有索引)不见,比如進(jìn)行uniq判斷時update a set b = 2(b要求唯一)。
- 多臺數(shù)據(jù)庫組成的分布式系統(tǒng)崔步,需要保證整體上的ACID稳吮,一種設(shè)計就是一個全局的事務(wù)管理服務(wù)加上每個數(shù)據(jù)庫都使用兩階段提交機(jī)制進(jìn)行分段式事務(wù)管理。
每一個方面的展開井濒,都有許許多多的細(xì)節(jié)灶似,高效合理地數(shù)據(jù)管理是個大工程,所以就像操作系統(tǒng)一樣瑞你,數(shù)據(jù)庫這樣一個程序經(jīng)久不衰酪惭,一直被人關(guān)注著。