資訊系統
現在需要開發一套資訊系統, 記錄系裡的學生、課程、 還有選課資訊。比如
學生資訊:[學號,姓名,性別,身份證號,入學日期,班級]
課程資訊:[課程號,課程名,授課老師]
選課:[學號,課程號,成績]
然後程式只需要讀寫這三個檔案就可以了。
中間層的引入
到了期末,各個老師希望能進行一些統計的工作,比如哪些人不及格,某學科的平均分等等。實際上就是對檔案進行查詢而已。如果每次都使用程式來進行操作,非常麻煩,而且不利於普及。
所以我們可以提供乙個中間層,把檔案層遮蔽掉,讓每個人都可以在這個中間層用簡單的方法進行查詢。我們把資料存放的結構叫表,每一列叫列、字段、屬性。
可以使用簡單的sql語句就能查詢
select 學號,姓名
from 學生資訊
where 入學日期='1991-9-1'
然後需要乙個解析器,可以把語句轉換為內部對檔案的操作。這樣還可以使用程式來呼叫抽象層來程式設計啊, 也不用直接操作檔案了
使用這樣的sql語句最大的好處是使用者完全不用考慮物理層的那些檔案的結構,只需要關注邏輯層的「表」就可以了。
中間的邏輯層的另外的好處是可以對物理層的檔案儲存進行優化了, 為了加快訪問速度, 可以增加了索引、b+樹,快取等手段。
總結起來,中間層的好處在於:
對使用者遮蔽了底層邏輯,只需要通過sql語句就可以進行操作了。
還可以對物理層的檔案儲存進行優化,加快訪問速度。
併發訪問
之前的訪問都是單機版的,但是如果有若干的客戶端連入呢?可能會存在
兩個客戶端同時對乙個檔案進行修改,所以後修改的會完全覆蓋前人的修改。
兩個客戶端同時對一行資料進行修改,會出現資料不一致。
那麼怎麼辦呢?
基於檔案的操作改變成基於行的操作, 每個人的修改只影響這一行。 這樣縱然兩個人同時修改乙個檔案,只要不在同一行都沒毛病。
修改某行資料的時候,要先給這一行加鎖。也就是乙個人修改的時候,不允許另乙個人修改。
原子性問題
現在我們已經解決了併發寫的帶來的資料不一致的問題,那麼還有沒有其他的風險點呢?系統故障。
比如電子系有1000元, 數學系有2000元
電子系給數學系轉賬200元, 系統先扣除了電子系的錢,現在餘額只有800 ,此時系統崩潰了。
重啟以後,就發現電子系的餘額是對的, 可是數學系還是2000元, 那200元丟了
所以轉賬的操作必須是原子的: **要麼全部發生, 要麼根本不發生。 **
可以把類似轉賬這樣的操作叫做「事務」, 但是怎麼實現呢?記錄日誌
在做真正的操作之前,
先記錄日誌:要修改哪一項,原來的值是什麼,現在的值是什麼
然後再修改
只有所有的操作都正確無誤寫入了磁碟,才會提交。否則就回滾
許可權管理
乙個沒有許可權控制的系統是非常危險的, 尤其是隨意刪除。
先定義三大類許可權:
對資料操作的, 例如select, update, insert等
對結構操作的, 例如建立表,修改表,等
做管理的, 例如備份資料, 建立使用者等
然後就可以把這些許可權授予某個使用者了
grant select on 財務表 to 系主任 #只能查詢。
grant create_table to 張老師:#可以建立**
這個系統的中間層完全可以剝離出來,形成乙個完整的軟體了,也就是資料庫
參考
資料庫(二),資料庫起源
現在需要開發一套資訊系統,記錄系裡的學生 課程 還有選課資訊。比如 可以使用三個獨立的文字檔案來儲存這些資訊,比如學生資訊 然後程式只需要讀寫這三個檔案就可以了。到了期末,各個老師希望能進行一些統計的工作,比如哪些人不及格,某學科的平均分等等。實際上就是對檔案進行查詢而已。如果每次都使用程式來進行操...
Mysql 資料庫(二)
一 儲存引擎 什麼是儲存引擎 在資料庫中,表的型別是不同的,而儲存引擎就是表的型別。針對不同的儲存引擎,資料庫也有不同的處理方法。show engines 檢視乙個儲存引擎。常用的儲存引擎 innodb 支援事物,支援事物安全表,支援行鎖定和外來鍵。什麼是事物 單個邏輯單元的執行的一系列操作,要麼都...
mysql資料庫效能資料 MYSQL資料庫效能優化
1.選取最適用的字段屬性 表中字段的寬度設得盡可能小 char 的上限為 255 位元組 固定占用空間 varchar 的上限 65535 位元組 實際占用空間 text 的上限為 65535。盡量把字段設定為 not null,執行查詢的時候,資料庫不用去比較 null 值。2.使用連線 join...