數(shù)據(jù)庫(kù)是一個(gè)程序,幫助管理數(shù)據(jù)用的。那么管理數(shù)據(jù)會(huì)面對(duì)哪些挑戰(zhàn)呢?
- 數(shù)據(jù)在磁盤上可以高效管理的組織方式
- 并發(fā)時(shí)能保證ACID(因?yàn)楹芏嘞到y(tǒng)對(duì)ACID的需求不那么嚴(yán)格,所以出現(xiàn)了某些NOSQL提出的最終一致性的調(diào)整)
- 在程序運(yùn)行到任何一步發(fā)生斷電/系統(tǒng)崩潰后,能恢復(fù)且保證ACID
- 分布式ACID
- 使用內(nèi)存提高數(shù)據(jù)管理性能,但仍要保證ACID的前提
- 方便使用
說(shuō)白了,就是在保證ACID(數(shù)據(jù)正確性)的前提下,對(duì)數(shù)據(jù)進(jìn)行管理的程序。我提到了很多次ACID,具體就不展開(kāi)來(lái)講,網(wǎng)上有很多相關(guān)資料。無(wú)論怎么解讀,其實(shí)就是在說(shuō)保證數(shù)據(jù)的正確性這個(gè)議題。
如果要展開(kāi)說(shuō),數(shù)據(jù)庫(kù)的內(nèi)容就很多了,我這里就簡(jiǎn)要地提幾個(gè)關(guān)鍵的地方,短短幾句話不可能面面俱到,請(qǐng)不要在意行文細(xì)節(jié)上的邏輯漏洞。
- 行級(jí)別的約束,比如性別(男/女),如果一個(gè)叫“火車”的性別記錄到數(shù)據(jù)庫(kù)里,那這個(gè)記錄就失去了準(zhǔn)確性了。
- 表級(jí)的約束,比如唯一約束uniq。
- 跨表級(jí)的約束,比如外鍵,例如一個(gè)學(xué)校有Bob/Lob兩位班主任,那通過(guò)外鍵可以約束A班的班主任只能是Bob或是Lob。同時(shí)也能約束這個(gè)系統(tǒng)不能失去班主任Bob和Lob的信息,除非他們已經(jīng)不屬于任何一個(gè)班級(jí)了。
- 所有針對(duì)數(shù)據(jù)的改變都要落到磁盤上,大部分?jǐn)?shù)據(jù)庫(kù)的做法都是所有的修改都追加寫(xiě)入日志文件而不是直接修改存放數(shù)據(jù)的文件。這樣就能做到回滾、斷電保護(hù)等效果。
- 提高查詢速度的內(nèi)存緩存,數(shù)據(jù)庫(kù)會(huì)把磁盤上的數(shù)據(jù)放入內(nèi)存進(jìn)行緩存,如果已經(jīng)緩存好了,就不會(huì)再去磁盤上讀了。雖然是緩存,仍不能拋棄ACID,這比平時(shí)用的如memcache等的緩存要求要嚴(yán)格得多。
- 提高查詢速度的索引,數(shù)據(jù)庫(kù)在進(jìn)行很多操作的時(shí)候,都可以藉由索引提高速度,比如查詢時(shí)select a where b = 1(b有索引),比如進(jìn)行uniq判斷時(shí)update a set b = 2(b要求唯一)。
- 多臺(tái)數(shù)據(jù)庫(kù)組成的分布式系統(tǒng),需要保證整體上的ACID,一種設(shè)計(jì)就是一個(gè)全局的事務(wù)管理服務(wù)加上每個(gè)數(shù)據(jù)庫(kù)都使用兩階段提交機(jī)制進(jìn)行分段式事務(wù)管理。
每一個(gè)方面的展開(kāi),都有許許多多的細(xì)節(jié),高效合理地?cái)?shù)據(jù)管理是個(gè)大工程,所以就像操作系統(tǒng)一樣,數(shù)據(jù)庫(kù)這樣一個(gè)程序經(jīng)久不衰,一直被人關(guān)注著。