轉載:碼農翻身
我就是你們常用的關系型數(shù)據(jù)庫舅桩, IBM的研究員E.F.Codd 于1970年把我的理論帶到這個世界上,我已經快50歲了雨膨。
我的家族成員居住在世界各地性能強悍的服務器中擂涛, 保存著你們人類的大量珍貴的數(shù)據(jù),從你的銀行余額聊记,到你的購物清單撒妈,幾乎每一筆網上交易都有我們負責保存。
我是如此重要排监,幾乎每一位軟件從業(yè)者都需要認真學習狰右,很多時候我都是存儲大量數(shù)據(jù)的首選,你要做的舆床,就是選擇一個我的家族成員而已棋蚌,比如:Oracle, MySQL, Db2,SQL Server這些家伙挨队。
對了谷暮,還有一個小巧玲瓏的SQLite,做手機端開發(fā)的離不開它瞒瘸。
在日新月異的IT界坷备, 一門技術居然能存活這么久熄浓,實在是不可思議情臭。
也許會有人想到這個問題: 你為什么能活這么久省撑?
簡單地拍腦袋想一想,也許是我能夠大規(guī)模地保存和檢索數(shù)據(jù)俯在? ?但是直接使用文件系統(tǒng)也可以熬癸?
為什么要數(shù)據(jù)庫跷乐? 還“關系”肥败?
不,我能活這么久愕提,是有一些獨門秘籍的馒稍。
1我有著堅實的數(shù)學基礎
這可真不是我吹牛,我的身上處處顯示著高貴的數(shù)學身影:
域浅侨,關系纽谒,笛卡爾積
關系代數(shù):選擇,投影如输,連接
......
對了鼓黔,你知道啥叫“關系”嗎? 面試官如果問你的話你該如何回答不见?
其實所謂關系澳化,在數(shù)學上的定義就是笛卡爾積的一個子集。
例如有兩個集合:
s1 ={a,b}
s2 = {1,2}
那s1和s2的笛卡爾積就是 :
s1 × s2 = {(a,1),(a,2),(b,1),(b,2)}
那么S 的任意一個子集都是關系:
{(a,1),(a,2)} 是一個“關系”
{(a,2), (b,1),(b,2)} 是另外一個“關系”
{(b,2)} 也是關系
......
如果你把s1和s2豎起來看稳吮,把s1看做列x能取值的集合缎谷, s2看做列y 能取值的集合, 那(x, y)它不就是一張表嗎?
我還有個很漂亮的性質:
關系(表)經過運算以后,如select联喘,join除嘹,where,交瘸彤、并、差,結果還是一個關系(表)!
你看我的數(shù)學基礎是不是很牢靠润梯?
2我很直觀
至少表面上看起來是這樣的,如果你想給一個非計算機專業(yè)的人講解數(shù)據(jù)庫甥厦,可以和Excel類比下纺铭, 看看他能不能聽懂: 瞧, 這不就是個表格嗎刀疙,有行有列的舶赔。
3使用簡單
這里不得不說說SQL這個優(yōu)秀的抽象層,它完全屏蔽了底層的實現(xiàn)細節(jié)谦秧,你完全不用考慮底層的文件是怎么存放的竟纳,只要發(fā)出SQL : SELECT ...... FROM ...... WHERE ...... 就好撵溃。
相比于早期復雜的層次狀,網狀數(shù)據(jù)庫锥累, SQL實在是太簡單了缘挑。
不僅僅是開發(fā)人員,你們的業(yè)務人員稍加培訓就可以寫SQL, ?我清晰地記得有個業(yè)務分析師經常去數(shù)據(jù)庫查數(shù)據(jù)桶略,然后告訴程序員說數(shù)據(jù)不對语淘,有Bug, 讓程序員非常頭疼际歼。
4對數(shù)據(jù)完整性的支持很好
我的每個字段都有確定的類型惶翻,還可以檢查數(shù)據(jù)的長度,取值范圍鹅心。
我的主鍵和外鍵维贺,共同保證了數(shù)據(jù)的精確性和一致性, 防止數(shù)據(jù)的缺失巴帮。
5我支持事務溯泣!
這可能是我能成功的一大關鍵了,?ACID對于核心系統(tǒng)的數(shù)據(jù)(如銀行賬號)無比重要榕茧,不難想象一個轉賬操作沒有完成會帶來什么樣的影響垃沦。
6范式
想要使用我們關系型數(shù)據(jù)庫,必須得遵守一定的規(guī)則用押,這些規(guī)則就是“范式”肢簿。
第一范式是基本要求,即每個列都是不分割的數(shù)據(jù)項蜻拨, 如果連這個都滿足不了池充,還是洗洗睡吧。
第二范式要求實體屬性要完全依賴主鍵缎讼,不能依賴部分主鍵收夸。
第三范式就是一個表中不能包含其它表中已包含的非主關鍵字信息。不嚴謹?shù)卣f就是這個表只包含其他表的ID血崭。
一般來說卧惜,你們都會遵循第一和第二范式, 但是為了性能夹纫,為了避免過多的join, 有時候會違反第三范式咽瓷,冗余一些字段的信息, 這我都可以理解舰讹。
7大家用我做“數(shù)據(jù)的集成”
這是大牛Martin Fowler 提出的觀點:
企業(yè)級應用程序居于一個豐富的生態(tài)系統(tǒng)中茅姜,它需要與其他應用程序協(xié)同工作,而那些程序是由不同的團隊合作開發(fā)出來的月匣。
不同的應用程序經常要使用同一份數(shù)據(jù)钻洒, 而且某個應用程序更新完數(shù)據(jù)以后奋姿,必須讓其他應用程序知道這份數(shù)據(jù)已經改變了。
采用”共享數(shù)據(jù)庫集成“ 航唆,多個應用程序都將數(shù)據(jù)保存在一個數(shù)據(jù)庫中,所有的應用很容易就能使用彼此的數(shù)據(jù)了院刁。
8遺留數(shù)據(jù)
幾十年來糯钙,我這里積累了大量的應用數(shù)據(jù),雖然說城頭變幻大王旗退腥,訪問關系數(shù)據(jù)庫的應用程序變了好幾茬任岸,編程語言也換了好幾波,但是關系數(shù)據(jù)庫中的數(shù)據(jù)巋然不動狡刘,他們的壽命遠遠超過應用程序的壽命享潜, 數(shù)據(jù)變成了一個企業(yè)寶貴的財富。
但是世界上沒有完美的東西嗅蔬, 我雖然有眾多優(yōu)點剑按, 但是也有不少缺點。
在互聯(lián)網時代澜术, 在高并發(fā)艺蝴,大流量的映襯下,這些缺點顯得格外刺眼:
對分布式系統(tǒng)支持不好, 難于組成集群鸟废,水平擴展比較難猜敢。
復雜的類型(XML、JSON等)不好表達盒延。
應對互聯(lián)網的海量請求力不從心缩擂。
......
為了應對這些問題,你們人類可以說是想了很多辦法添寺,比如什么NoSQL數(shù)據(jù)庫胯盯,什么分庫分表,在比如你們發(fā)展了BASE理論计露,不追求ACID中的強一致性陨闹,只要達到“基本可用”,最終一致性就可以了薄坏。
但是我不得不說趋厉,對于核心的數(shù)據(jù),交由我來保管才是正道胶坠。
我已經快50了君账,不知道能不能再活50年,但是再活20年我覺得是沒問題的沈善,所以乡数,我建議你還是好好學習一下吧椭蹄。