前言:想要寫出一篇令人眼前一亮的文章嗎?我們特意為您整理了5篇mysql數(shù)據(jù)庫范文,相信會為您的寫作帶來幫助,發(fā)現(xiàn)更多的寫作思路和靈感。
【 關(guān)鍵詞 】 mysql;范式;數(shù)據(jù)表
The Structure Design Based on MySQL Database
Chang Da-jun
(College of Electrical And Information, Changchun Architecture & Civil Engineering Clllege JilinChangchun 130607)
【 Abstract 】 MySQL database is a kind of open source relational database with open cross platform, it is that its things and its related data in the form of a two-dimensional table data information description,at the same time, the MySQL provides the complete constraint operation,so as to guarantee data security.This paper is based on the relevant data and information of university research management platform,develop and study the structure relationship between the relevant data tables and data and data.
【 Keywords 】 mysql; paradigm; data table
1 引言
數(shù)據(jù)庫作為信息管理工具,已然成為當(dāng)今數(shù)據(jù)信息管理的重要管理平臺。作為關(guān)系型數(shù)據(jù)庫MySQL,由于其具有的開源性和跨平臺性已經(jīng)越來越多的被廣大用戶所使用。MySQL數(shù)據(jù)庫可以實現(xiàn)多源化數(shù)據(jù)連接操作,包括網(wǎng)絡(luò)連接、ODBC連接等,同時MySQL還提供優(yōu)化查詢系統(tǒng),通過改系統(tǒng)查詢操作可以提高查詢效率和查詢速度,從而提高用戶對數(shù)據(jù)信息的處理過程。本文以高校科研管理的相關(guān)數(shù)據(jù)信息作為數(shù)據(jù),通過建立科研立項信息表、管理機構(gòu)信息表以及項目申請人信息表等多張表格,在MySQL數(shù)據(jù)庫的信息管理平臺上,進(jìn)行相關(guān)表格中數(shù)據(jù)信息以及表與表之間的數(shù)據(jù)結(jié)構(gòu)分析。
2 3NF范式
2.1 3NF概述
數(shù)據(jù)冗余是在數(shù)據(jù)處理方面需要解決的重要內(nèi)容,數(shù)據(jù)冗余處理如何會直接影響最終數(shù)據(jù)處理結(jié)果。因此在設(shè)計數(shù)據(jù)庫時候,特別是在關(guān)系型數(shù)據(jù)庫的設(shè)計過程中,往往要提出不同規(guī)范即范式來規(guī)范數(shù)據(jù)操作,達(dá)到用戶所需的要求。關(guān)系型數(shù)據(jù)庫主要提供六種范式,但其中常用的是第三范式――3NF,其以第二范式為基礎(chǔ),消除函數(shù)間的依賴關(guān)系。
在3NF中,數(shù)據(jù)結(jié)構(gòu)遵循第二范式中提出的數(shù)據(jù)信息定位化原則,也就是說在數(shù)據(jù)規(guī)范化的過程中,采用第三范式進(jìn)行數(shù)據(jù)規(guī)范時要以第二范式作為數(shù)據(jù)規(guī)范操作基礎(chǔ),然后將第二范式得到的數(shù)據(jù)關(guān)系模式采用數(shù)據(jù)投影方式將數(shù)據(jù)關(guān)系進(jìn)行分解,從而得到3NF范式關(guān)系模式集合,完成第三范式的數(shù)據(jù)規(guī)范化操作過程,達(dá)到較好的數(shù)據(jù)冗余處理結(jié)果。
2.2 3NF定義
在數(shù)據(jù)庫的研究過程中,針對計算機及其相關(guān)技術(shù)發(fā)展的不同階段,所給出有關(guān)第三范式的定義也是各不相同。在研究3NF前先給出有關(guān)第三范式傳遞函數(shù)的定義。
定義:如果XY,YZ,且YZ是非平凡函數(shù)依賴,但不成立YX和ZY,則稱Z傳遞函數(shù)依賴于X,記作XYZ。
通過定義可以看出,在X、Y和Z三者之間存在相互依賴關(guān)系,也就是說假如存在一個關(guān)系集合R(u)所構(gòu)成的關(guān)系模式,其中關(guān)系X和關(guān)系Y之間存在著關(guān)系X決定關(guān)系Y,然后關(guān)系Y又決定關(guān)系Z,因此Y依賴與X,而Z依賴與Y。
2.3 投影分解過程及其算法
第二范式雖然規(guī)范化了數(shù)據(jù)表格的操作,但在數(shù)據(jù)冗余消除、刪除異常和插入異常等問題不能得到較好的解決,而第三范式卻能較好解決上述問題的出現(xiàn),因此對于第三范式在進(jìn)行解決的過程中除了要依賴與第二范式外,還要采用投影分解方式來實現(xiàn)對數(shù)據(jù)表的分解過程,以達(dá)到第三范式對數(shù)據(jù)表的要求,具體投影分解步驟及其算法如下:
(1)設(shè)關(guān)系集合R及其最小函數(shù)依賴關(guān)系集合Rmin;
(2)求出R的最小函數(shù)依賴集Rmin;
(3)如果R中的關(guān)系集合等于函數(shù)依賴集合Rmin,則說明關(guān)系集合R∈3NF范式,結(jié)束第三范式分解過程;如果在Rmin的屬性集合中不存在,但在R屬性集合中存在的屬性關(guān)系,則將相應(yīng)屬性從R中刪除,從而構(gòu)成一個新關(guān)系模式集合,將過程轉(zhuǎn)向(2);如果存在某個函數(shù)依賴關(guān)系,即Rmin中依賴與R的所有屬性關(guān)系,關(guān)系集合R將不能分解;但如果Rmin中存在有X依賴與Y的關(guān)系,則分解之后的關(guān)系包中應(yīng)該應(yīng)包含{XY}的關(guān)系集合,若有XY1,XY2,XY3......XYn都屬于Rmin中的關(guān)系集合,則分解之后的關(guān)系集合包應(yīng)該包含{XY1,Y2,Y3......Yn}。
通過上面對第三范式的投影分解算法及其步驟描述過程來看,當(dāng)?shù)冢?)步中如果存在X不是非主屬性,則Y對任意鍵值多存在函數(shù)傳遞依賴關(guān)系XYZ,因此關(guān)系集合R是3NF。否則不存在函數(shù)傳遞依賴關(guān)系,則不存在第三范式,需要進(jìn)行上述步驟。
3 數(shù)據(jù)庫結(jié)構(gòu)設(shè)計
3.1 數(shù)據(jù)表設(shè)計
數(shù)據(jù)表格的建立是完成數(shù)據(jù)信息存儲和信息處理的重要過程,根據(jù)高校科研信息管理平臺建設(shè)以及完成對數(shù)據(jù)信息處理需要,建立相關(guān)數(shù)據(jù)表,用戶信息表、申請教師信息表、申請學(xué)院信息表等。通過對高校科研信息管理需求分析所得到的結(jié)果可以規(guī)劃出有關(guān)數(shù)據(jù)表,本文以院系及專業(yè)為例進(jìn)行第三范式的投影分解過程來進(jìn)行第三范式的研究。在院系及專業(yè)方面所涉及到的數(shù)據(jù)主要是學(xué)院編號、學(xué)院名稱、專業(yè)編號及專業(yè)名稱等,因此得到的數(shù)據(jù)如表1所示。
根據(jù)表1的描述可以看出,在該表中學(xué)院ID是作為該表中的主鍵,也就是說在該表中學(xué)院ID是完成該表數(shù)據(jù)索引的唯一鍵值,學(xué)院名稱、專業(yè)ID和專業(yè)名只是作為非規(guī)范化數(shù)據(jù)信息,因此如果在完成數(shù)據(jù)信息插入、刪除、修改等工作會出現(xiàn)數(shù)據(jù)信息操作錯誤,而在數(shù)據(jù)冗余方面也沒達(dá)到較好的數(shù)據(jù)冗余處理,在使用該表來完成數(shù)據(jù)信息操作會出現(xiàn)較高的數(shù)據(jù)冗余,所以在用戶管理上存在不便,同時在DBMS中的管理中也存在缺陷。
3.2 數(shù)據(jù)結(jié)構(gòu)操作
為了減少數(shù)據(jù)冗余和有關(guān)插入、刪除等誤操作,對表1進(jìn)行數(shù)據(jù)規(guī)范化處理。根據(jù)第三范式――3NF定義及其算法的描述,對表1進(jìn)行投影操作,完成對數(shù)據(jù)信息分解和分化,以達(dá)到數(shù)據(jù)表格簡化,實現(xiàn)數(shù)據(jù)結(jié)構(gòu)優(yōu)化目的。在整個數(shù)據(jù)結(jié)構(gòu)優(yōu)化操作過程中主要采用3NF范式的投影過程,將表1完成結(jié)構(gòu)化和規(guī)范化,方便數(shù)據(jù)處理和數(shù)據(jù)保存等過程。根據(jù)3NF范式的要求,得到表2和表3。
表2主要作用是完成對申請教師所在學(xué)院信息的數(shù)據(jù)存儲,根據(jù)高校科研管理信息平臺設(shè)計的需要,將該表中的字段名collegeid設(shè)計為主鍵,是各個申請教師所在學(xué)院信息的區(qū)別表述。
表3主要作用是完成申請教師專業(yè)信息存儲和處理,在設(shè)計該表過程中需要將dptid設(shè)置為該表關(guān)鍵字,即專業(yè)的唯一性。同時,在該表中以collegeid作為外鍵以達(dá)到表2和表1之間的依賴關(guān)系,完成第三范式的投影操作過程。
4 結(jié)束語
通過本文以高校科研管理平臺中所涉及到數(shù)據(jù)表1的數(shù)據(jù)處理過程,以及采用第三范式完成對表2和表3的投影分解,可以看出3NF在對數(shù)據(jù)結(jié)構(gòu)處理過程中降低數(shù)據(jù)冗余,使得數(shù)據(jù)更加完整和簡捷。同時,對第三范式的使用,使得改系統(tǒng)在使用過程不會出現(xiàn)插入異常、刪除異常等操作導(dǎo)致信息在讀取上的錯誤信息。
參考文獻(xiàn)
[1] 周煒,周敏剛.關(guān)系數(shù)據(jù)庫二三范式判別算法[J].航空計算技術(shù),2006年04期.
[2] 王振杰,顏虹,黨少農(nóng).規(guī)范化數(shù)據(jù)庫設(shè)計在醫(yī)學(xué)數(shù)據(jù)管理中的應(yīng)用[J].中國衛(wèi)生統(tǒng)計,2009年03期.
[3] 歐陽林艷.無損BCNF分解算法的改進(jìn)[J].洛陽師范學(xué)院學(xué)報,2015年02期.
基金項目:
吉教科合字[2014]第622號。
【關(guān)鍵詞】 PHP語言 MySQL數(shù)據(jù)庫 數(shù)據(jù)表 連接
一、引言
隨著時代的飛速發(fā)展,科學(xué)技術(shù)手段水平的不斷提高,人們對互聯(lián)網(wǎng)的要求也越來越高,各類管理系統(tǒng)也成為了現(xiàn)代科技不可或缺的產(chǎn)物。
以PHP+MySQL為基礎(chǔ)開發(fā)的管理系統(tǒng),因為其獨特的優(yōu)點成為了各大公司管理系統(tǒng)建設(shè)的首要選擇,而PHP與MySQL的連接更是各類管理系統(tǒng)的核心。
二、PHP語言簡介
PHP(超文本預(yù)處理器)是一種廣泛運用的開源腳本語言。語法吸收了C語言、Java和Perl的特點,可以嵌入到HTML中,利于學(xué)習(xí),使用廣泛,主要適用于Web開發(fā)領(lǐng)域。PHP 獨特的語法混合了C、Java、Perl以及PHP自創(chuàng)的語法,并提供了與各種數(shù)據(jù)庫連接的函數(shù)。PHP是完全免費的,可以不受任何限制的獲取源代碼和自用下載,使得PHP的使用效率很高。
三、MySQL數(shù)據(jù)庫簡介
MySQL是一種開放源代碼的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB公司開發(fā),MySQL數(shù)據(jù)庫因其體積小、速度快、總體擁有成本低而受到了中小企業(yè)的熱捧。MySQL數(shù)據(jù)庫是基于Linux操作系統(tǒng)開發(fā)出來的數(shù)據(jù)庫,眾所周知Linux是開放源碼的操作系統(tǒng),所以MySQL數(shù)據(jù)庫也是開放源碼的免費數(shù)據(jù)庫,這也是MySQL數(shù)據(jù)庫的最大優(yōu)點,雖然其功能的多樣性和性能的穩(wěn)定性差強人意,但是依然有很多用戶在使用。
四、創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)表
以下操作均以本項目“飯卡智能管理系統(tǒng)”作為示例進(jìn)行說明,數(shù)據(jù)庫名稱為ecard,用戶信息表名稱為:info_ user。
當(dāng)然,在Mysql中創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)表最簡單的方法就是利用鼠標(biāo)進(jìn)行操作,而在這里,我主要談?wù)摰氖抢肧QL語句進(jìn)行設(shè)計。
在MySQL中創(chuàng)建數(shù)據(jù)庫用CREATE DATABASE(ecard);語句實現(xiàn)。以防在后來數(shù)據(jù)庫操作中因編碼的問題而出現(xiàn)亂碼的情況,在這里,我建議此步驟可以利用手動方法建立數(shù)據(jù)庫,排序規(guī)則選擇utf8-general-ci;
數(shù)據(jù)庫建好之后就是創(chuàng)建數(shù)據(jù)表了,在Mysql中創(chuàng)建數(shù)據(jù)表的語句是:
CREATE TABLE info_user(ID INT(11) PRIMARY KEY AUTO_INCREMENT,
Name VARCHAR(25) NOT NULL,
Gender VACHAR(2) NOT NULL,
ID_card VARCHAR(35) NOT NULL ,
Phone VARCHAR(25) NOT NULL,
Password VARCHAR(25) NOT NULL,
Department VARCHAR(25) NOT NULL);
其中ID表示學(xué)號,Name表示姓名,Gender表示性別,ID_card表示身份證號,Phone表示聯(lián)系方式,Password表示密碼,Department表示院系。
到這里,數(shù)據(jù)庫和數(shù)據(jù)表就已經(jīng)建立成功了。
五、PHP語言連接MySQL數(shù)據(jù)庫
在PHP中,要連接數(shù)據(jù)庫,首先必須得創(chuàng)建與數(shù)據(jù)庫對應(yīng)的字段,這里主要討論如何連接數(shù)據(jù)庫,用到的語句為:
$link=mysql_connect(’localhost’,’root’,’’);連接數(shù)據(jù)庫
mysql_select_db(’ecard’,$link);選擇數(shù)據(jù)庫
$ s q l = " S E L E C T * F R O M i n f o _ u s e r W H E R E ID=binary(’{$ID}’)";數(shù)據(jù)庫查詢語句
$res=mysql_query($sql,$link)or die("查詢失敗".mysql_ error($link));判斷語句,如果執(zhí)行成功則返回TRUE,執(zhí)行不成功則返回FALSE
$arr=mysql_num_rows($res);返回結(jié)果集行的數(shù)目
$sql="INSERT INTO info_user(ID,Name,Gender,ID_ card,Phone,Password,Department) VALUES(’{$ID}’,’{$name}’,’{$gender}’,’{$ID_card}’,’{$Phone}’,’{$Password}’,’{$Department}’)";數(shù)據(jù)庫插入語句
至此,PHP語言連接MySQL數(shù)據(jù)庫成功。
六、結(jié)束語
學(xué)校在經(jīng)費缺、人員少的情況下,利用信息化手段建設(shè)和應(yīng)用飯卡管理系統(tǒng),對于規(guī)范學(xué)校的管理系統(tǒng)具有極其重要意義。有利于提高飯卡的利用效率,提高學(xué)校后勤集團(tuán)的工作效率和服務(wù)水平, 也給廣大師生提供了便利。
參 考 文 獻(xiàn)
關(guān)鍵詞:MySQL;C API;多線程
中圖分類號:TP311文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2007)16-30904-02
Based on C API MySQL Database Multi-threaded Access Methods
YU Cheng-gong
(Zhejiang Pharmaceutical College,Ningbo 315100,China)
Abstract:Currently,the database in all walks of life were widely used.In many commercial database software,SQL Server and Oracle are used more and therefore their prices are more expensive. This paper describes the MySQL database in single-threaded or multi-threaded programming environment using C API access to the MySQL database, and gives the corresponding code and analysis. The database is open source database, with a higher maturity level, and the community version can be used for free. It satisfies the need to use the C API access to the database of project development, and reduces development costs.
Key words:MySQL;C API;multi-threaded
1 引言
隨著社會信息化的深入,數(shù)據(jù)庫在社會各個領(lǐng)域被廣泛應(yīng)用。在這些數(shù)據(jù)庫應(yīng)用項目開發(fā)過程中,需要做兩方面的決策:1. 使用何種數(shù)據(jù)庫軟件;2. 采用何種方式訪問數(shù)據(jù)庫。數(shù)據(jù)庫軟件的選擇面比較寬,在目前眾多商業(yè)數(shù)據(jù)庫軟件中,SQL SERVER 和ORACLE被較多的使用,當(dāng)然這兩個數(shù)據(jù)庫軟件的價格也較昂貴,本文選擇可免費使用的MySQL數(shù)據(jù)庫社區(qū)版本,MySQL庫屬于開源數(shù)據(jù)庫,具有較高的成熟度和可靠性。數(shù)據(jù)庫的訪問方式有很多,可以使用ODBC、DAO、ADO等方法,這些方法簡單直接但是效率不高,不適合大型復(fù)雜的系統(tǒng)使用,例如網(wǎng)絡(luò)游戲的數(shù)據(jù)庫系統(tǒng)開發(fā)需要考慮同時大量的數(shù)據(jù)庫訪問,因此訪問的效率非常重要。基于C程序語言的高效率,使用C API訪問數(shù)據(jù)庫可以提高數(shù)據(jù)庫的訪問效率。基于以上兩點,本文將介紹基于C API的MySQL數(shù)據(jù)庫訪問方法,給出在單線程和多線程程序環(huán)境下的具體代碼和分析。
2 建表
為了方便說明數(shù)據(jù)庫的訪問,先建立一個數(shù)據(jù)庫表TestTable,可以使用SQL語句創(chuàng)建該表,也可以使用MySQL提供的圖形界面來創(chuàng)建。數(shù)據(jù)庫表中字段如下:
該數(shù)據(jù)庫表使用最常見的用戶名和密碼作為字段,本文將通過該表來實現(xiàn)不同程序環(huán)境下基于C API的數(shù)據(jù)庫的訪問方法。
3 單線程程序的數(shù)據(jù)庫訪問
單線程應(yīng)用程序訪問MySQL數(shù)據(jù)庫相對簡單,其過程包含以下幾步:
(1)初始化MySQL庫
(2)初始化數(shù)據(jù)庫連接句柄
(3)連接數(shù)據(jù)庫
(4)通過SQL語句操作數(shù)據(jù)庫并處理相應(yīng)數(shù)據(jù)
(5)關(guān)閉數(shù)據(jù)庫連接
(6)結(jié)束MySQL庫
通過這五個步驟即可實現(xiàn)數(shù)據(jù)庫的訪問,具體代碼和分析如下:
//在main主函數(shù)中添加代碼
//1.定義訪問數(shù)據(jù)庫所需變量
MYSQL * myData;
MYSQL_RES * res;
MYSQL_ROW row;
//2. 初始化MySQL庫和數(shù)據(jù)庫連接句柄
myData = mysql_init((MYSQL*) 0);
//3. 連接數(shù)據(jù)庫,MYSQL_IP和MYSQL_PORT表示數(shù)據(jù)庫的IP和端口
// MYSQL_ACCOUNT, MYSQL_PASSWORD表示數(shù)據(jù)庫連接的帳號和密碼
//MYSQL_DBNAME表示所要訪問的數(shù)據(jù)庫名
mysql_real_connect( myData, MYSQL_IP, MYSQL_ACCOUNT, MYSQL_PASSWORD, MYSQL_DBNAME, MYSQL_PORT,NULL, 0 )
//4. 通過SQL語句操作數(shù)據(jù)庫并處理相應(yīng)數(shù)據(jù)
//4.1新建用戶名為abcdef,密碼為123456的記錄
mysql_query(myData, "insert into TestTable value(‘a(chǎn)bcdef’,’ 123456’)");
//4.2顯示所有記錄
//查詢所有記錄
mysql_query(myData, "select * from TestTable");
//將查詢結(jié)果保存到res中
res = mysql_store_result( myData ) ;
//逐條顯示記錄
Int j = 0;
while ( row = mysql_fetch_row( res ) ) {//獲取一條記錄
j = mysql_num_fields( res ) ;//獲取每條記錄的字段數(shù)
for ( k = 0 ; k < j ; k++ )
printf( “%s”, row[k] ) ;
printf( “\n”) ;
}
//釋放res
mysql_free_result( res ) ;
//5. 關(guān)閉數(shù)據(jù)庫連接
mysql_close( myData );
//6. 結(jié)束MySQL庫
mysql_library_end();
關(guān)于代碼的幾點說明:
(1)定義變量中的三個數(shù)據(jù)結(jié)構(gòu)為訪問MySQL所需,MYSQL結(jié)構(gòu)表示一個數(shù)據(jù)庫連接的句柄,其中包含了數(shù)據(jù)庫連接所需的參數(shù),MYSQL_RES結(jié)構(gòu)表示數(shù)據(jù)庫訪問中一個查詢的返回結(jié)果,MYSQL_ROW結(jié)構(gòu)表示返回結(jié)構(gòu)中的一條記錄;
(2)獲取查詢結(jié)果res并處理完畢,必須釋放res,否則會造成內(nèi)存泄露
(3)在單線程時,步驟初始化MySQL庫和數(shù)據(jù)庫連接句柄可合并, 由mysql_init()來處理。該函數(shù)會自動調(diào)用函數(shù)mysql_library_init()來初始化MySQL庫,同時初始化連接句柄。
4 多線程環(huán)境下的數(shù)據(jù)庫訪問
多線程環(huán)境下的數(shù)據(jù)庫訪問需要保證線程安全。Windows版本的MySQL C API函數(shù)都是線程安全的,除了mysql_library_init(),而我們剛才的代碼中使用的mysql_init()函數(shù)會自動調(diào)用函數(shù)mysql_library_init()來初始化MySQL庫,因此在多線程環(huán)境下,需要不同的初始化代碼和清理代碼。具體過程如下:
(1)在主函數(shù)中調(diào)用mysql_library_init()來初始化MySQL庫;
(2)啟動各數(shù)據(jù)庫訪問線程
(3)主函數(shù)等待各個線程的結(jié)束
(4)調(diào)用mysql_library_end ()清理MySQL庫。
其中數(shù)據(jù)庫訪問線程的代碼和單線程數(shù)據(jù)庫訪問代碼類似,但是需要如下變化:
(1)單線程中的第2步初始化MySQL庫和數(shù)據(jù)庫連接句柄,不能再使用mysql_init(),代碼應(yīng)作如下修改:
//初始化線程
my_init();
mysql_thread_init();
//初始化myData
myData = malloc(sizeof(MYSQL));
memset(&myData, 0, sizeof(MYSQL))
(2)上述初始化myData,只是將myData所有成員設(shè)為0,如果有需要可以根據(jù)具體情況設(shè)置該結(jié)構(gòu)成員的值,例myData->reconnect= 1,其作用是設(shè)置數(shù)據(jù)庫連接屬性為重連接,即當(dāng)數(shù)據(jù)庫連接斷開時,自動重新連接;
(3)單線程中的第6步不在需要,改為結(jié)束線程的清理工作,即調(diào)用mysql_thread_end()函數(shù)。
5 總結(jié)
綜上所述,使用C API訪問MySQL數(shù)據(jù)庫在不同線程環(huán)境下的區(qū)別主要在于初始化和訪問結(jié)束后清理代碼,也就是說除了初始化和清理代碼,MySQL提供給我們的C API函數(shù)都是線程安全的。最后需要有一點說明,使用C API訪問數(shù)據(jù)庫可以提高數(shù)據(jù)庫的訪問效率,但并不是所有的數(shù)據(jù)庫項目都適合這種方式,該方式適合需要大量實時并發(fā)處理的數(shù)據(jù)庫項目,例如網(wǎng)絡(luò)游戲的數(shù)據(jù)庫項目,對于有此需求的數(shù)據(jù)庫項目可參考本文。
參考文獻(xiàn):
【關(guān)鍵詞】Mysql數(shù)據(jù)庫 圖書管理 系統(tǒng)安全 研究
SQL(結(jié)構(gòu)化查詢語言)是世界上最流行的和標(biāo)準(zhǔn)化的數(shù)據(jù)庫語言。Mysql可以說是目前最為流行的開源數(shù)據(jù)庫管理系統(tǒng)軟件,是一個真正的多用戶、多線程SQL數(shù)據(jù)庫服務(wù)器。Mysql開放源碼,快捷靈活、穩(wěn)定和容易使用等優(yōu)點決定了其在中小型管理系統(tǒng)應(yīng)用的優(yōu)勢。本文以基于Mysql網(wǎng)絡(luò)數(shù)據(jù)庫的圖書管理系統(tǒng)為例,從安全穩(wěn)定性要求和采取的安全策略等方面進(jìn)行分析研究。
1 Mysql在信息管理系統(tǒng)的應(yīng)用與優(yōu)勢
1.1 Mysql的基本特性與應(yīng)用
Mysql與其他大型數(shù)據(jù)庫Oracle、DB2、SQL Server等相比,有自身的不足之處,但是沒有影響到Mysql在信息管理系統(tǒng)的應(yīng)用。在個人或者是中小型的企業(yè),Mysql發(fā)揮了自身的優(yōu)勢與作用。Mysql開放源碼,具有快捷靈活、穩(wěn)定和容易使用等優(yōu)點,并有效的提供了PHP、C,C++,JAVA和HTML等主流前端開發(fā)軟件的API接口。支持多種操作系統(tǒng)包括Windows 、Linux 、Solaris、Mas OS等。目前,搭建動態(tài)網(wǎng)站或者服務(wù)器的開源軟件組合有典型的網(wǎng)絡(luò)架構(gòu)LAMP,極大地方便了開發(fā)者。Mysql應(yīng)用非常廣泛,Google、facebook、等使用Mysql作為網(wǎng)絡(luò)數(shù)據(jù)庫。
1.2 Mysql應(yīng)用于圖書管理系統(tǒng)的優(yōu)勢
Mysql應(yīng)用于圖書管理系統(tǒng)的優(yōu)勢主要分為三個方面,一是免費開源優(yōu)勢,如果再使用linux操作系統(tǒng),可以減少購買操作系統(tǒng)和數(shù)據(jù)庫的開銷。二是多種平臺支持的優(yōu)勢,Mysql可以與多個平臺進(jìn)行有效的連接,實現(xiàn)信息資源的共享。三是中小型數(shù)據(jù)庫靈活穩(wěn)定的優(yōu)勢,在設(shè)計Mysql程序的時候,加入了SQL中沒有的一些補充條件,更加的適用于在中小型數(shù)據(jù)庫中使用。圖書管理系統(tǒng)通常要保存用戶信息、圖書信息和借閱信息,以及建立相關(guān)的書籍查詢等,數(shù)據(jù)倉庫并不是很龐大,因此,使用Mysql來管理數(shù)據(jù)非常合適。
2 基于Mysql的圖書管理系統(tǒng)安全穩(wěn)定性分析
高校圖書管理系統(tǒng)是基于互聯(lián)網(wǎng)的網(wǎng)絡(luò)數(shù)據(jù)庫,通常采用B/S的體系結(jié)構(gòu),因此,在瀏覽器層、Web 服務(wù)器層、數(shù)據(jù)庫服務(wù)器層都會存在安全性要求,以及在操作系統(tǒng)、網(wǎng)絡(luò)技術(shù)等方面的安全問題。只有控制好圖書管理系統(tǒng)的安全問題,才能保證信息資源的有效共享。
基于網(wǎng)絡(luò)數(shù)據(jù)庫的圖書管理系統(tǒng)的安全穩(wěn)定性具有以下幾個特點:
(1)較高的穩(wěn)定性,包括操作系統(tǒng)的穩(wěn)定性和數(shù)據(jù)庫系統(tǒng)的穩(wěn)定性,要保持Mysql數(shù)據(jù)庫的正常運行軌跡。
(2)數(shù)據(jù)的保密性能,對客戶信息、訪問瀏覽量、客戶端等進(jìn)行有效的保密。
(3)運行的速度很快,包括瀏覽器端、數(shù)據(jù)庫服務(wù)器端的訪問速度,以保證數(shù)據(jù)信息在查找、修改等方面的快速反應(yīng)。
(4)數(shù)據(jù)的備份與數(shù)據(jù)的恢復(fù)功能。數(shù)據(jù)庫服務(wù)器中,包括圖書信息、借閱圖書記錄、客戶賬號等在內(nèi)的相關(guān)數(shù)據(jù)的安全問題,是保證圖書管理系統(tǒng)正常運轉(zhuǎn)的重要因素。要采取嚴(yán)格的防范措施,同時,當(dāng)發(fā)生數(shù)據(jù)故障的時候,要在最短的時間內(nèi)恢復(fù)數(shù)據(jù)與系統(tǒng)。
3 基于Mysql的圖書管理系統(tǒng)安全穩(wěn)定性策略
圖書管理系統(tǒng)通常采用三層B/S結(jié)構(gòu)模式,即用戶層、Wed服務(wù)器層和數(shù)據(jù)庫層。圖書管理系統(tǒng)要注意提高數(shù)據(jù)庫安全、操作系統(tǒng)安全和網(wǎng)絡(luò)安全技術(shù)等方面的安全策略。
3.1 優(yōu)化數(shù)據(jù)庫設(shè)計
比如,在遵循關(guān)系模式規(guī)范化的基礎(chǔ)上,優(yōu)化表設(shè)計適當(dāng)增加中間表或增加冗余字段以減少連接查詢所花的時間,優(yōu)化JOIN操作和子查詢盡量使用全連接避免產(chǎn)生中間表,盡量避免LIKE 關(guān)鍵字和通配符進(jìn)行查詢。另外,還可以修改my.ini文件,對相關(guān)參數(shù)如sort_buffer_size 、read_buffer_size 、query_cache_size、max_connections等,設(shè)置合適的緩沖區(qū)大小和MySQL允許的最大連接進(jìn)程數(shù),以優(yōu)化服務(wù)器提高系統(tǒng)性能,提高保證圖書信息資源查詢效率。
3.2 數(shù)據(jù)容災(zāi)與備份機制
要定期地進(jìn)行數(shù)據(jù)備份,保護(hù)圖書書目數(shù)據(jù)、流通數(shù)據(jù)、客戶信息等。定期的進(jìn)行數(shù)據(jù)庫的重組工作,增強數(shù)據(jù)庫的使用性能。用好MYSQL的容災(zāi)與備份機制,比如:建立主從數(shù)據(jù)庫集群,采用 MySQL 復(fù)制;制定數(shù)據(jù)庫備份/恢復(fù)計劃;啟動數(shù)據(jù)庫服務(wù)器的二進(jìn)制變更日志;定期檢查數(shù)據(jù)表;定期對備份文件進(jìn)行備份;把 MySQL 的數(shù)據(jù)目錄和備份文件分別放到兩個不同的驅(qū)動器中,等等。
3.3 帳戶安全策略
可以從賬戶安全檢查、系統(tǒng)內(nèi)部安全措施、哈希加密等方面著手進(jìn)行。比如,檢查用戶表mysql.user是否有匿名空賬號(user=‘’ ),如有應(yīng)將其刪除。使用哈希加密帳戶密碼。加強客戶的登錄認(rèn)證,尤其是服務(wù)器主機的登錄認(rèn)證。在主數(shù)據(jù)庫創(chuàng)建從數(shù)據(jù)庫操作所用的用戶,并指定使用SLL 認(rèn)證等等。
3.4 網(wǎng)絡(luò)安全和操作系統(tǒng)安全策略
在網(wǎng)絡(luò)安全策略方面,利用NAT技術(shù),有效的防止發(fā)生來自網(wǎng)絡(luò)外部的攻擊現(xiàn)象,將局域網(wǎng)絡(luò)內(nèi)部的計算機系統(tǒng)進(jìn)行隱蔽。正確設(shè)置計算機操作系統(tǒng),確保客戶使用真實身份,登錄具有合法性。此外,還可以設(shè)置系統(tǒng)的實時監(jiān)控,優(yōu)化網(wǎng)絡(luò)防火墻、文件加密以及殺毒軟件技術(shù)的升級,等等。
4 結(jié)語
綜上所述,要確保基于Mysql在圖書館管理系統(tǒng)的安全穩(wěn)定性能,要考慮很多種因素的影響,在數(shù)據(jù)庫設(shè)計、數(shù)據(jù)庫服務(wù)器、數(shù)據(jù)容災(zāi)與備份、帳戶安全,以及計算機網(wǎng)絡(luò)、操作系統(tǒng)等方面進(jìn)行優(yōu)化配置。圖書管理系統(tǒng)的安全與穩(wěn)定性能保證了信息數(shù)據(jù)的安全、穩(wěn)定性與高效,保證了客戶在不同的時間、地點、平臺中有效的使用圖書館的資源信息共享。
參考文獻(xiàn)
[1]晉征.論基于網(wǎng)絡(luò)數(shù)據(jù)庫的圖書館管理系統(tǒng)安全性研究與實現(xiàn)[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2015(3):27-29.
[2]陽學(xué)軍.基于網(wǎng)絡(luò)和人工智能的圖書館信息管理系統(tǒng)研究[J].岳陽職業(yè)技術(shù)學(xué)院學(xué)報,2005(3):59-61.
[3]林愛鮮.基于神經(jīng)網(wǎng)絡(luò)的圖書館管理系統(tǒng)的構(gòu)建研究[J].電腦與電信,2012(4):48-50.
[4]田華.圖書館分布式數(shù)據(jù)庫安全技術(shù)研究[J].現(xiàn)代情報,2007(4):161-163
關(guān)鍵詞: 數(shù)據(jù)庫; 完整性; 觸發(fā)器; MySQL
中圖分類號:TP311 文獻(xiàn)標(biāo)志碼:A 文章編號:1006-8228(2014)04-66-03
Abstract: The trigger is a special storing procedure, and a major method to force the business rules and control the data integrity. The control mechanism of data integrity according to trigger technology in MySQL is discussed, mainly work principle and implementation process with examples of analysis and design. In connection with the emphasis and difficulty of trigger in database learning, the understanding and using introduction of trigger in MySQL are given.
Key words: database; integrity; trigger; MySQL
0 引言
隨著計算機技術(shù)的發(fā)展,數(shù)據(jù)已經(jīng)滲透到當(dāng)今每一個行業(yè)和業(yè)務(wù)職能領(lǐng)域,成為重要的生產(chǎn)因素。數(shù)據(jù)庫技術(shù)已經(jīng)成為計算機信息系統(tǒng)與應(yīng)用系統(tǒng)的核心技術(shù)和重要基礎(chǔ)。數(shù)據(jù)庫是一門理論與實踐緊密結(jié)合的課程,它作為計算機及相關(guān)專業(yè)的骨干課程,在教學(xué)中占有重要的位置[1]。觸發(fā)器是這門課程中的一個重點,觸發(fā)器的靈活性增加了學(xué)生學(xué)習(xí)的難度,是該門課程的難點之一[2]。
觸發(fā)器是與表事件相關(guān)聯(lián)的特殊存儲過程,它們不能直接執(zhí)行,只在發(fā)生針對表的insert、update、delete事件時觸發(fā)。用戶不能繞過觸發(fā)器,除非觸發(fā)器向客戶端發(fā)送消息,否則最終用戶將不會意識到觸發(fā)器的存在。
觸發(fā)器的開發(fā)涉及多種SQL技術(shù)。要開發(fā)出良好的觸發(fā)器,必須理解事務(wù)的流程和鎖定、SQL以及存儲過程。觸發(fā)器包含幾個獨特的元素,開發(fā)人員必須對其進(jìn)行仔細(xì)規(guī)劃,并通過觸發(fā)器實現(xiàn)復(fù)雜的業(yè)務(wù)規(guī)則和數(shù)據(jù)驗證功能。
有些DBA反對使用觸發(fā)器,因為它們是專用的。如果將數(shù)據(jù)庫移植到其他平臺,必須重寫大部分觸發(fā)器代碼。另外,觸發(fā)器還被指責(zé)影響性能。然而,如果規(guī)則過于復(fù)雜,無法使用約束來實現(xiàn),則只能使用觸發(fā)器來實現(xiàn)。業(yè)務(wù)規(guī)則在服務(wù)器外實現(xiàn)就不是規(guī)則了,而只是建議。設(shè)計糟糕的觸發(fā)器將影響性能,但設(shè)計良好的觸發(fā)器不但可以確保數(shù)據(jù)完整性,還能提供良好的性能[3]。
1 基本概念
觸發(fā)發(fā)器是一種特殊的存儲過程,它在插入、刪除或修改特定表中的數(shù)據(jù)時觸發(fā)執(zhí)行,它比數(shù)據(jù)庫本身標(biāo)準(zhǔn)的功能有更精細(xì)和更復(fù)雜的數(shù)據(jù)控制能力。與存儲過程不同的是,存儲過程通過其他程序來啟動運行,而觸發(fā)器由一個事件來啟動運行,并且觸發(fā)器不能接收參數(shù)[4]。
數(shù)據(jù)庫觸發(fā)器有以下作用。
⑴ 安全性:可以基于數(shù)據(jù)庫的值使用戶具有操作數(shù)據(jù)庫的某種權(quán)利。
⑵ 審計:可以跟蹤用戶對數(shù)據(jù)庫的操作,審計用戶操作數(shù)據(jù)庫的語句,把用戶對數(shù)據(jù)庫的更新寫入審計表。
⑶ 實現(xiàn)復(fù)雜的數(shù)據(jù)完整性規(guī)則:實現(xiàn)非標(biāo)準(zhǔn)的數(shù)據(jù)完整性檢查和約束,觸發(fā)器可產(chǎn)生比規(guī)則更為復(fù)雜的限制,與規(guī)則不同,觸發(fā)器可以引用列或數(shù)據(jù)庫對象。例如,觸發(fā)器可以回退任何借出去的書超過庫存的數(shù)量。
⑷ 實現(xiàn)復(fù)雜的非標(biāo)準(zhǔn)的數(shù)據(jù)庫相關(guān)完整性規(guī)則。觸發(fā)器可以對數(shù)據(jù)庫中相關(guān)的表進(jìn)行連環(huán)更新。
⑸ 同步實時地復(fù)制表中的數(shù)據(jù)。
⑹ 自動計算數(shù)據(jù)值。如果數(shù)據(jù)的值達(dá)到了一定的要求,則進(jìn)行特定的處理。例如,某本書的庫存低于一定指標(biāo),則立刻向圖書管理員發(fā)出警告數(shù)據(jù)。
2 創(chuàng)建觸發(fā)器
只有具備super權(quán)限的MySQL用戶才能執(zhí)行創(chuàng)建觸發(fā)器的命令。創(chuàng)建觸發(fā)器命令格式如下:
CREATE TRIGGER trigger_name BEFORE|AFTER
INSERT|UPDATE|DELETE ON table_name FOR
EACH ROW CODE.
觸發(fā)器是與表有關(guān)的命名數(shù)據(jù)庫對象,當(dāng)表上出現(xiàn)特定事件時,將激活該對象。
觸發(fā)器與命名為table_name的表相關(guān),table_name必須引用永久性表,MySQL中不能將觸發(fā)器與TYEMPORARY表或視圖關(guān)聯(lián)起來。
{ BEFORE | AFTER }:觸發(fā)器有執(zhí)行的時間設(shè)置,可以設(shè)置為事件發(fā)生前或后。
{ INSERT | UPDATE | DELETE }:同樣也能設(shè)定觸發(fā)的事件,它們可以在執(zhí)行INSERT、UPDATE或DELETE的過程中觸發(fā)。
FOR EACH ROW:觸發(fā)器的執(zhí)行間隔,F(xiàn)OR EACH ROW子句通知觸發(fā)器 每隔一行執(zhí)行一次動作,而不是對整個表執(zhí)行一次。
觸發(fā)器的觸發(fā)事件可以是下列三種之一。
⑴ INSERT:將新行插入表時激活觸發(fā)器程序,例如,通過INSERT、LOAD DATA和REPLACE語句。
⑵ UPDATE:更改某一行時激活觸發(fā)器,例如,通過UPDATE語句。
⑶ DELETE:從表中刪除某一行時激活觸發(fā)器,例如,通過DELETE和REPLACE語句。
請注意,觸發(fā)事件與表操作方式激活觸發(fā)程序的SQL語句并不很類似,這點很重要。例如,關(guān)于INSERT的BEFRORE觸發(fā)程序不僅能被INSERT語句激活,也能被LOAD DATA語句激活。
對于具有相同觸發(fā)程序動作時間和事件的給定表,不能有兩個觸發(fā)程序。例如,對于某一張表,不能有兩個BEFORE UPDATE觸發(fā)程序。但可以有一個BEFORE UPDATE觸發(fā)程序和一個BEFORE INSERT觸發(fā)程序,或一個BEFORE UPDATE觸發(fā)程序和一個AFTER UPDATE觸發(fā)程序。
CODE是當(dāng)觸發(fā)程序激活時執(zhí)行的語句。如果打算執(zhí)行多個語句,可使用BEGIN…END復(fù)合語句結(jié)構(gòu)。這樣,就能使用存儲子程序中允許的相同語句了。
另外,觸發(fā)器執(zhí)行的語句有以下兩個限制。
限制⑴:觸發(fā)程序不能調(diào)用將數(shù)據(jù)返回客戶端的存儲程序,也不能使用采用CALL語句的動態(tài)SQL語句,但是允許存儲程序通過參數(shù)將數(shù)據(jù)返回觸發(fā)程序。也就是存儲過程或者函數(shù)通過OUT或者INOUT類型的參數(shù)將數(shù)據(jù)返回觸發(fā)器是可以的,但是不能調(diào)用直接返回數(shù)據(jù)的過程。
限制⑵:不能在觸發(fā)器中使用以顯式或隱式方式開始或結(jié)束事務(wù)的語句,如START TRANSACTION、COMMIT或者ROLLBACK。
3 刪除觸發(fā)器
目前,并沒有ALTER TRIGGER語句,不過可以先使用DROP TRIGGER語句(刪除觸發(fā)器),然后再使用CREATE TRIGGERA語句創(chuàng)建一個新的觸發(fā)器。
刪除觸發(fā)器的命令格式如下:
DROP TRIGGER[IF EXISTS] trigger_name
這條語句用于刪除觸發(fā)器。當(dāng)觸發(fā)器不存在時,使用關(guān)鍵字IF EXISTS可以避免出現(xiàn)出錯信息。若不使用該關(guān)鍵字,它會生成一個注釋,在執(zhí)行SHOW WARNINGS語句后,可以顯示該注釋。可以指定與觸發(fā)器關(guān)聯(lián)的數(shù)據(jù)庫或模式。如果不指定,將使用當(dāng)前默認(rèn)數(shù)據(jù)庫。從MySQL5.1.6版本開始,該語句需要具有與給定觸發(fā)器相關(guān)的表的TRIGGER權(quán)限,方能執(zhí)行。在以前的MySQL版本中,它僅需要SUPER權(quán)限即可執(zhí)行該語句。如果對MySQL5.0.10版本或更老版本升級時,請確保刪除它的所有觸發(fā)器,因為使用舊版本的觸發(fā)器會帶來問題。
4 OLD和NEW
NEW.column_name或者OLD.column_name,這樣在技術(shù)上處理(NEW|OLD.column_name)新和舊的列名屬于創(chuàng)建了過渡變量("transition variables")。對于INSERT語句,只有NEW是合法的;對于DELETE語句,只有OLD才合法;而UPDATE語句可以同時使用NEW和OLD。
5 觸發(fā)器在圖書管理系統(tǒng)中的應(yīng)用
觸發(fā)器程序?qū)⒂玫揭韵氯龔埍恚?/p>
⑴ Publiser(pub_id,pub_name,pub_tel,pub_web, pub_addr)
出版社(出版社_id,出版社名,電話,網(wǎng)址,地址)
⑵ Borrow_book(borrow_id,out_date,in_date,renew_count,renew_date,over_time,over_payment)
借閱(借閱_id,借出日期,歸還日期,續(xù)借次數(shù),續(xù)借日期,超期時間,超期費用)
⑶ Reader(reader_id,user,password,create_date,name,borrow_count)
讀者(借書證號,用戶名,密碼,注冊日期,姓名,借閱數(shù)量)
例1 當(dāng)從publiser表中更新數(shù)據(jù)時,希望向另兩個表中寫入數(shù)據(jù),保存更新前后的信息。
新建兩張與publiser結(jié)構(gòu)一樣的表old_publiser與new_publisher。
DELIMITER |
CREATE TRIGGER tri_publisher_update
AFTER UPDATE
ON publisher FOR EACH ROW
/*保存更新前的信息*/
BEGIN
INSERT INTO old_publisher
(pub_id,pub_name,pub_tel,pub_web, pub_addr)
VALUES
(OLD.pub_id,OLD.pub_name,OLD.pub_tel,OLD.pub_web,
OLD.pub_addr);
/*保存更新后的信息*/
INSERT INTO new_publisher
(pub_id,pub_name,pub_tel,pub_web, pub_addr)
VALUES
(NEW.pub_id,NEW.pub_name,NEW.pub_tel,NEW.pub_web,
NEW.pub_addr);
END |
DELIMITER;
驗證該觸發(fā)器:
UPDATE publisher SET pub_tel=’010-6832629
4’ WHERE pub_id='P00002';
SELECT * FROM old_publisher;
SELECT * FROM new_publisher;
例2 借書觸發(fā)器
DELIMITER |
CREATE TRIGGER tri_borrow_book_insertli
AFTER INSERT ON borrow_book
FOR EACH ROW
/*借書在borrow_book表插入新紀(jì)錄時,自動更新讀者表的已借數(shù)量*/
BEGIN
UPDATE reader SET borrow_count=borrow_count+1
WHERE reader_id=NEW.reader_id;
END |
DELIMITER;
例3 還書觸發(fā)器
DELIMITER |
CREATE TRIGGER tri_borrow_book_update
AFTER UPDATE ON borrow_book
FOR EACH ROW
/*還書時更新borrow_book 表時,自動更新讀者表的已借數(shù)量*/
BEGIN
IF ISNULL(OLD.return_date) AND NOT ISNULL
(NEW.return_date) THEN
UPDATE reader SET borrow_count=borrow_count-1
WHERE reader_id=NEW.reader_id;
END IF;
END |
DELIMITER;
6 結(jié)束語
本文從理論教學(xué)和實踐教學(xué)兩個方面對MySQL數(shù)據(jù)庫中觸發(fā)器的實現(xiàn)進(jìn)行了探討,并應(yīng)用到了浙江農(nóng)林大學(xué)數(shù)據(jù)庫類課程的教學(xué)當(dāng)中。實踐表明該方法提高了學(xué)生對MySQL觸發(fā)器學(xué)習(xí)的積極性,使他們能輕松掌握觸發(fā)器的實現(xiàn)過程。教學(xué)效果和學(xué)生的學(xué)習(xí)效率得到了提高。
參考文獻(xiàn):
[1] 吳達(dá)勝,劉麗娟.《數(shù)據(jù)庫原理與技術(shù)》的理論與實踐教學(xué)的整體優(yōu)化研究[J].計算機時代,2005.11:31-32
[2] 劉麗娟,吳達(dá)勝.滾動式分層教學(xué)在數(shù)據(jù)庫課程中的應(yīng)用[J].科技信息,2009.36:127-130