Linux數(shù)據(jù)庫(kù)大比拼_第1頁(yè)
Linux數(shù)據(jù)庫(kù)大比拼_第2頁(yè)
Linux數(shù)據(jù)庫(kù)大比拼_第3頁(yè)
Linux數(shù)據(jù)庫(kù)大比拼_第4頁(yè)
Linux數(shù)據(jù)庫(kù)大比拼_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Linux數(shù)據(jù)庫(kù)大比拼當(dāng)?shù)谝淮斡腥私ㄗh我為L(zhǎng)inuxPlanet寫(xiě)數(shù)據(jù)庫(kù)管理系統(tǒng)的比較時(shí),我搖了搖頭,我從來(lái)沒(méi)做過(guò)這樣的比較,但是后來(lái),我想:有何不可?也許一種新鮮天真的方法并不壞。因此就有本文:一種全新眼光看繽紛的Linux數(shù)據(jù)庫(kù)世界。本文共4部分。 在這里比較的數(shù)據(jù)庫(kù)管理器是免費(fèi)的或有便宜的許可費(fèi),并且他們可在所有層次的Linux系統(tǒng)上運(yùn)行,從低端硬件到高端多處理器服務(wù)器,他們已經(jīng)廣泛地應(yīng)用世界范圍的生產(chǎn)系統(tǒng)上。為了比較,我把我自己放在了運(yùn)行典型的Linux機(jī)器的境地,每天都由 DBMS提供動(dòng)力。 我將考察: mSQL MySQL PostgreSQL我將以一個(gè)這3個(gè)數(shù)據(jù)庫(kù)系統(tǒng)的安裝和配置

2、的討論開(kāi)始,然后我將在第2部分繼續(xù),通過(guò)用SQL的一個(gè)小數(shù)據(jù)庫(kù)的設(shè)計(jì),指出我碰到的困難和試圖使數(shù)據(jù)庫(kù)系統(tǒng)接受的差異,我也將解釋一個(gè)程序的編碼,它在數(shù)據(jù)庫(kù)上執(zhí)行各種的真實(shí)操作,例如增加數(shù)據(jù)并產(chǎn)生報(bào)表,同時(shí)討論數(shù)據(jù)庫(kù)在處理上的各種差別。這個(gè)客戶程序針對(duì)所有3個(gè)數(shù)據(jù)庫(kù)系統(tǒng)用C語(yǔ)言實(shí)現(xiàn)。為此,我必須不僅學(xué)習(xí)所有系統(tǒng)SQL API,還有SQL。如果沒(méi)有其他東西,這將肯定饒有興趣地看下去。 第三部分將包含一些真實(shí)的基準(zhǔn)測(cè)試,作為獎(jiǎng)賞。我已經(jīng)有了在Linux 新聞組上款觀看關(guān)于數(shù)據(jù)庫(kù)的基準(zhǔn)測(cè)試結(jié)果沒(méi)完沒(méi)了的爭(zhēng)論的保持懷疑的樂(lè)趣,因此我將只測(cè)試客戶程序做隨機(jī)事情的時(shí)間性能,既在理想的條件下運(yùn)行跑又通過(guò)多個(gè)并發(fā)

3、進(jìn)程的時(shí)候。那時(shí)我將已經(jīng)涉及DBMS之間的大多數(shù)差別,因此你應(yīng)該有了關(guān)于他們的強(qiáng)項(xiàng)和弱項(xiàng)的一個(gè)良好概念。 最后的部分將是你所期待的一切:結(jié)論、覆蓋的特征、實(shí)現(xiàn)、在DBMS之間的API和性能差別。 但是現(xiàn)在,準(zhǔn)備深入數(shù)據(jù)庫(kù)管理的王國(guó)的探險(xiǎn)吧。 獲得并安裝 PostgreSQL 位于PostgreSQL 網(wǎng)站的軟件小節(jié),有一個(gè)FTP和HTTP鏡像網(wǎng)站的列表,可從他們下載分發(fā),也有定購(gòu)DBMS CD的選擇。構(gòu)造并安裝它是一個(gè)多步驟過(guò)程。 首先,如果你想要建立Postgresql的Perl語(yǔ)言綁定,在你系統(tǒng)上的Perl 5 可執(zhí)行文件必須已知是perl5的名字。通常,這意味著你需要做一個(gè)符號(hào)連接。 也

4、許要做的最重要的事情是創(chuàng)造一個(gè)postgres用戶。在我的系統(tǒng)上,這個(gè)命令可運(yùn)行: useradd - c “ PostgreSQL Administrator” - d /opt/postgresql - g users postgres 在其他系統(tǒng)上,命令可能有所不同。注意我假定postgres是在users組里。你可能比較喜歡給數(shù)據(jù)庫(kù)主管一個(gè)它自己的組。 如果不另外說(shuō)明,所有其它安裝步驟需要以用戶postgres身份來(lái)做。解開(kāi)PostgreSQL下載包并進(jìn)入源代碼目錄樹(shù): tar - xvzf postgresql-6.5.2.tar.gz cd postgresql-6.5.2 用ro

5、ot用戶,創(chuàng)建PostgreSQL目錄并把交給postgres用戶: mkdir /opt/pgsql chown postgres.users /opt/pgsql 進(jìn)入源代碼目錄并配置軟件包。我用下列選擇: ./configure - prefix=/opt/pgsql - with-perl 進(jìn)行構(gòu)造和安裝過(guò)程: cd . /doc make install cd . /src make all make install現(xiàn)在是執(zhí)行一些附加的系統(tǒng)配置的時(shí)間了。 作為root,將下行 /opt/pgsql/lib 加入/etc/ld.so.conf并運(yùn)行l(wèi)dconfig。 安裝Perl綁定,

6、當(dāng)用root登錄后: cd interface/perl5 make install 設(shè)置postgres賬號(hào)。將下列行增加到.profile文件中: PATH=$PATH:/opt/pgsql/bin MANPATH=$MANPATH:/opt/pgsql/man PGLIB=/opt/pgsql/lib PGDATA=/opt/pgsql/data export PATH MANPATH PGLIB PGDATA LC_COLLATE=C LC_CTYPE=C export LC_COLLATE LC_CTYPE 最后3行對(duì)init過(guò)程和也許某些測(cè)試是必要的試。對(duì)實(shí)際的用戶,他們當(dāng)然應(yīng)該設(shè)

7、置到適當(dāng)?shù)默F(xiàn)場(chǎng),但是每個(gè)使用 PostgreSQL的人至少需要有PGLIB和PGDATA的設(shè)置。 Source .profile文件: source .profile 運(yùn)行后期安裝: initdb 獲得并安裝 MySQL MySQL的最新版本可從MySQL下載頁(yè)。有很多可選擇的鏡像站點(diǎn)。你需要執(zhí)行下列步驟: 解開(kāi)包并進(jìn)入源代碼目錄樹(shù): tar - xvzf mysql-3.22.26a.tar.gz cd mysql-3.22.26a 配置軟件包;我使用下列選項(xiàng)目: ./configure - prefix=/opt/mysql 構(gòu)造它: make 安裝它;用root用戶: make inst

8、all 然后你需要配置安裝: 作為root用戶,創(chuàng)建授權(quán)數(shù)據(jù)庫(kù)表: scripts/mysql_install_db 作為root,啟動(dòng)服務(wù)器: /opt/mysql/bin/safe_mysqld & 作為root,創(chuàng)建mysql用戶: useradd - c “ MySQL Administrator” - d /opt/mysql - g users mysql 作為root,把安裝樹(shù)屬權(quán)賦給mysql用戶:獲得并安裝 mSQL 下載mSQL不比下載PostgreSQL或MySQL那樣簡(jiǎn)單, 但是,其分發(fā)更小。從Hughes技術(shù)網(wǎng)頁(yè)開(kāi)始并且尋找更進(jìn)一步的指令。為了下載mSQL,首先需要在

9、該站點(diǎn)注冊(cè)并且通過(guò)一個(gè)基于CGI的下載系統(tǒng),如有必要允許你在一些鏡像站點(diǎn)間選擇。構(gòu)造和安裝的mSQL的步驟如下: 解開(kāi)包并進(jìn)入源代碼目錄: tar - xvzf msql-2.0.11.tar.gz cd msql-2.0.11 產(chǎn)生目標(biāo)定義: make target 進(jìn)入你平臺(tái)的目標(biāo)目錄: cd targets/Linux-2.2.12-i586 配置軟件包: ./setup 編輯site.mm;我將安裝路徑改成/opt/msql。 構(gòu)造它: make all 作為root 用戶安裝它: make install 在構(gòu)造和安裝的mSQL以后,你需要配置它: 作為root,創(chuàng)建msql用戶:

10、useradd - c “mSQL Administrator” - d /opt/msql - g users msql 作為root,把目錄屬權(quán)交給msql用戶: chown - R msql.users /opt/msql 據(jù)庫(kù)設(shè)計(jì)編者按:這是涉及可自由地獲得的Linux DBMS的系列文章的第二部分。 為了測(cè)試并比較3個(gè)數(shù)據(jù)庫(kù)管理系統(tǒng),我當(dāng)然需要一個(gè)數(shù)據(jù)庫(kù)來(lái)管理他們。在讀完了SQL傻瓜書(shū)后,我有了一些如何設(shè)計(jì)現(xiàn)實(shí)的數(shù)據(jù)庫(kù)的基本知識(shí),因此我揀選了一特別無(wú)聊的真實(shí)世界情形(一個(gè)因特網(wǎng)書(shū)店,其他?)并且寫(xiě)下了一個(gè)小型數(shù)據(jù)庫(kù)設(shè)計(jì)以便探討一點(diǎn)Sql的能力。 在這個(gè)數(shù)據(jù)庫(kù)里有5個(gè)表,BOOK保存可

11、得到的書(shū)的登記信息;CUSTOMER包含登記的顧客。對(duì)每份訂單,BOOKORDER創(chuàng)建一行,參照其顧客。對(duì)每個(gè)定購(gòu)的項(xiàng)目,在ORDER_POSITION里引用它的訂單號(hào)。作為一種獎(jiǎng)勵(lì),針對(duì)書(shū)的排名我增加了一RATING表。 下列的SQL代碼可裝入到一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)的SQL監(jiān)控程序并且被接受應(yīng)該沒(méi)有任何問(wèn)題。所有的表在創(chuàng)建前被刪除因此確保他們不會(huì)在創(chuàng)建之前已經(jīng)存在。DROP TABLE BOOK; CREATE TABLE BOOK ( ARTICLE_NO INTEGER PRIMARY KEY, AUTHOR_FIRST_NAMES CHARACTER(30), AUTHOR_LAST_NAM

12、ES CHARACTER(30), TITLE CHARACTER(30), ISBN CHARACTER(13) UNIQUE, WHOLESALE_PRICE NUMERIC(4,2), RETAIL_PRICE NUMERIC(4,2), COPIES_AVAILABLE INTEGER ); DROP TABLE CUSTOMER; CREATE TABLE CUSTOMER ( CUSTOMER_NO INTEGER PRIMARY KEY, FIRST_NAMES CHARACTER(30), LAST_NAMES CHARACTER(30), STREET CHARACTER(3

13、0), HOUSE_NO SMALLINT, POSTCODE CHARACTER(7), TOWN CHARACTER(30), ISO_COUNTRY_CODE CHARACTER(2) ); DROP TABLE BOOKORDER; CREATE TABLE BOOKORDER ( ORDER_NO INTEGER PRIMARY KEY, CUSTOMER_NO INTEGER NOT NULL, ORDERED DATE, DELIVERY DATE, STATUS CHARACTER(8) CHECK (STATUS IN (ACCEPTED, DELAYED, SHIPPED,

14、 RETURNED, PAID), CONSTRAINT CUSTOMER_FK FOREIGN KEY (CUSTOMER_NO) REFERENCES KUNDE (KUNDENNAME) ); DROP TABLE ORDER_POSITION; CREATE TABLE ORDER_POSITION ( POSITION_NO INTEGER PRIMARY KEY, ORDER_NO INTEGER NOT NULL, ARTICLE_NO INTEGER NOT NULL, NUMBER SMALLINT, CONSTRAINT ORDER_FK FOREIGN KEY (ORDE

15、R_NO) REFERENCES BOOKORDER (ORDER_NO), CONSTRAINT BOOK_FK FOREIGN KEY (ARTICLE_NO) REFERENCES BOOK (ARTICLE_NO) ); DROP TABLE RATING; CREATE TABLE RATING ( RATING_NO INTEGER PRIMARY KEY, ARTICLE_NO INTEGER NOT NULL, SCORE NUMERIC(1,0), COMMENT CHARACTER VARYING(300), CONSTRAINT BOOK_FK FOREIGN KEY (

16、ARTICLE_NO) REFERENCES BOOK (ARTICLE_NO) ); 當(dāng)然,這是一個(gè)極其簡(jiǎn)單的數(shù)據(jù)庫(kù)。它看上去真實(shí),但是它不適用于真實(shí)世界的應(yīng)。它不保存顧客記錄或任何東西,并且它甚至沒(méi)有書(shū)的出版商的列。它只是一個(gè)測(cè)試環(huán)境。 注意我不想花大氣力強(qiáng)制CUSTOMER.ISO_COUNTRY_CODE為今天是實(shí)際有效的編碼。我在代碼做了一點(diǎn)限制以測(cè)試數(shù)據(jù)庫(kù)系統(tǒng)是否接受他們;我沒(méi)嘗試使數(shù)據(jù)庫(kù)無(wú)懈可擊。 改變?cè)O(shè)計(jì)適應(yīng)PostgreSQL當(dāng)我將遵循ANSI標(biāo)準(zhǔn)的CREATE TABLE語(yǔ)句裝入Postgresql的psql監(jiān)控視程序是,我遇到的困難是很少的。我得到一些警告:外部關(guān)鍵字限制

17、被接受但還沒(méi)有實(shí)現(xiàn),而且我不得不裁減RATING的COMMENT字段到255個(gè)字符,因?yàn)檫@是PostgreSQL的CHARACTER VARYING類型的字段的最大字段寬度。系統(tǒng)為存儲(chǔ)大量數(shù)據(jù)提供BLOB數(shù)據(jù)類型,但是它們不在標(biāo)準(zhǔn)版本內(nèi),因此我決定了不使用他們。另外的問(wèn)題是相當(dāng)愚蠢-因?yàn)槲也荒苷业接嘘P(guān)PostgreSQL如何強(qiáng)制NUMERIC到C數(shù)據(jù)類型,也因?yàn)槲也幌胧褂胒loat以避免舍入,我決定使得貨幣字段為分值(cent)的整數(shù)數(shù)字。 我最后得到了這個(gè)略有不同的腳本: DROP TABLE BOOK; CREATE TABLE BOOK ( ARTICLE_NO INTEGER PRIM

18、ARY KEY, AUTHOR_FIRST_NAMES CHARACTER(30), AUTHOR_LAST_NAMES CHARACTER(30), TITLE CHARACTER(30), ISBN CHARACTER(13) UNIQUE, WHOLESALE_PRICE INTEGER, RETAIL_PRICE INTEGER, COPIES_AVAILABLE INTEGER ); DROP TABLE CUSTOMER; CREATE TABLE CUSTOMER ( CUSTOMER_NO INTEGER PRIMARY KEY, FIRST_NAMES CHARACTER(3

19、0), LAST_NAMES CHARACTER(30), STREET CHARACTER(30), HOUSE_NO SMALLINT, POSTCODE CHARACTER(7), TOWN CHARACTER(30), ISO_COUNTRY_CODE CHARACTER(2) ); DROP TABLE BOOKORDER; CREATE TABLE BOOKORDER ( ORDER_NO INTEGER PRIMARY KEY, CUSTOMER_NO INTEGER NOT NULL, ORDERED DATE, DELIVERY DATE, STATUS CHARACTER(

20、8) CHECK (STATUS IN (ACCEPTED, DELAYED, SHIPPED, RETURNED, PAID), CONSTRAINT CUSTOMER_FK FOREIGN KEY (CUSTOMER_NO) REFERENCES KUNDE (KUNDENNAME) ); DROP TABLE ORDER_POSITION; CREATE TABLE ORDER_POSITION ( POSITION_NO INTEGER PRIMARY KEY, ORDER_NO INTEGER NOT NULL, ARTICLE_NO INTEGER NOT NULL, NUMBER

21、 SMALLINT, CONSTRAINT ORDER_FK FOREIGN KEY (ORDER_NO) REFERENCES BOOKORDER (ORDER_NO), CONSTRAINT BOOK_FK FOREIGN KEY (ARTICLE_NO) REFERENCES BOOK (ARTICLE_NO) ); DROP TABLE RATING; CREATE TABLE RATING ( RATING_NO INTEGER PRIMARY KEY, ARTICLE_NO INTEGER NOT NULL, SCORE SMALLINT, COMMENT CHARACTER VA

22、RYING(255), CONSTRAINT BOOK_FK FOREIGN KEY (ARTICLE_NO) REFERENCES BOOK (ARTICLE_NO) ); 使設(shè)計(jì)適應(yīng)MySQL MySQL象PostgreSQL一樣忽略外部關(guān)鍵字的限制,但是它搞了個(gè)UNIQUE限制。最后的腳本與PostgreSQL腳本差不多: DROP TABLE BOOK; CREATE TABLE BOOK ( ARTICLE_NO INTEGER PRIMARY KEY, AUTHOR_FIRST_NAMES CHARACTER(30), AUTHOR_LAST_NAMES CHARACTER(30)

23、, TITLE CHARACTER(30), ISBN CHARACTER(13), WHOLESALE_PRICE INTEGER, RETAIL_PRICE INTEGER, COPIES_AVAILABLE INTEGER ); DROP TABLE CUSTOMER; CREATE TABLE CUSTOMER ( CUSTOMER_NO INTEGER PRIMARY KEY, FIRST_NAMES CHARACTER(30), LAST_NAMES CHARACTER(30), STREET CHARACTER(30), HOUSE_NO SMALLINT, POSTCODE C

24、HARACTER(7), TOWN CHARACTER(30), ISO_COUNTRY_CODE CHARACTER(2) ); DROP TABLE BOOKORDER; CREATE TABLE BOOKORDER ( ORDER_NO INTEGER PRIMARY KEY, CUSTOMER_NO INTEGER NOT NULL, ORDERED DATE, DELIVERY DATE, STATUS CHARACTER(8), CONSTRAINT CUSTOMER_FK FOREIGN KEY (CUSTOMER_NO) REFERENCES KUNDE (KUNDENNAME

25、) ); DROP TABLE ORDER_POSITION; CREATE TABLE ORDER_POSITION ( POSITION_NO INTEGER PRIMARY KEY, ORDER_NO INTEGER NOT NULL, ARTICLE_NO INTEGER NOT NULL, NUMBER SMALLINT, CONSTRAINT ORDER_FK FOREIGN KEY (ORDER_NO) REFERENCES BOOKORDER (ORDER_NO), CONSTRAINT BOOK_FK FOREIGN KEY (ARTICLE_NO) REFERENCES B

26、OOK (ARTICLE_NO) ); DROP TABLE RATING; CREATE TABLE RATING ( RATING_NO INTEGER PRIMARY KEY, ARTICLE_NO INTEGER NOT NULL, SCORE NUMERIC(1,0), COMMENT CHARACTER VARYING(255), CONSTRAINT BOOK_FK FOREIGN KEY (ARTICLE_NO) REFERENCES BOOK (ARTICLE_NO) ); 使設(shè)計(jì)適應(yīng) mSQL 因?yàn)閙SQL是一個(gè)精簡(jiǎn)的數(shù)據(jù)庫(kù)管理器(的確,有些人可能懷疑MySQL和mSQL是

27、否是數(shù)據(jù)庫(kù)管理系統(tǒng)),它放棄了大多數(shù)Sql的功能而僅僅接受SQL的一個(gè)嚴(yán)格限制的子集。這樣,mSQL的腳本看上有很大不同: DROP TABLE BOOK CREATE TABLE BOOK ( ARTICLE_NO INTEGER NOT NULL, AUTHOR_FIRST_NAMES CHARACTER(30), AUTHOR_LAST_NAMES CHARACTER(30), TITLE CHARACTER(30), ISBN CHARACTER(13), WHOLESALE_PRICE MONEY, RETAIL_PRICE MONEY, COPIES_AVAILABLE INTEG

28、ER ) DROP TABLE CUSTOMER CREATE TABLE CUSTOMER ( CUSTOMER_NO INTEGER NOT NULL, FIRST_NAMES CHARACTER(30), LAST_NAMES CHARACTER(30), STREET CHARACTER(30), HOUSE_NO SMALLINT, POSTCODE CHARACTER(7), TOWN CHARACTER(30), ISO_COUNTRY_CODE CHARACTER(2) ) DROP TABLE BOOKORDER CREATE TABLE BOOKORDER ( ORDER_

29、NO INTEGER NOT NULL, CUSTOMER_NO INTEGER NOT NULL, ORDERED DATE, DELIVERY DATE, STATUS CHARACTER(1) ) DROP TABLE ORDER_POSITION CREATE TABLE ORDER_POSITION ( POSITION_NO INTEGER NOT NULL, ORDER_NO INTEGER NOT NULL, ARTICLE_NO INTEGER NOT NULL, NUMBER SMALLINT ) DROP TABLE RATING CREATE TABLE RATING

30、( RATING_NO INTEGER NOT NULL, ARTICLE_NO INTEGER NOT NULL, SCORE SMALLINT, COMMENT TEXT(255) ) 幾乎所有的約束都不見(jiàn)了,并且NUMERIC和CHARACTER VARYING分別由MONEY和TEXT代替。 在mSQL的監(jiān)視程序中有令人沮喪的不足:它似乎不能接受從標(biāo)準(zhǔn)輸入輸入SQL腳本,這樣, 需要剪切/粘貼代碼。mSQL也討厭分號(hào);最終我只能一個(gè)一個(gè)地輸入命令并用g(“go”斜杠命令)終止每條命令 。 實(shí)現(xiàn)測(cè)試客戶 為了比較3個(gè)數(shù)據(jù)庫(kù)管理器,我決定為執(zhí)行在bookstore數(shù)據(jù)庫(kù)上的交易的目的用C寫(xiě)

31、了一個(gè)測(cè)試客戶。結(jié)果,我實(shí)現(xiàn)了一些操作,它們能比較API。為了性能比較,我隨后充分實(shí)現(xiàn)了它們,并且把一個(gè)非交互式模式加入客戶程序,因此它能自己運(yùn)行,產(chǎn)生隨意的數(shù)據(jù)且隨機(jī)執(zhí)行交易。 我決定了在樣品數(shù)據(jù)庫(kù)上實(shí)現(xiàn)下列行動(dòng): 增加一本新書(shū): INSERT INTO BOOK (.) VALUES (.); 刪除一本存在的書(shū): DELETE FROM BOOK WHERE ARTICLE_NO=.; 增加一個(gè)顧客: INSERT INTO CUSTOMER (.) VALUES (.); 刪除一個(gè)顧客: DELETE FROM CUSTOMER WHERE CUSTOMER_NO=.; 訂書(shū)的一個(gè)顧客:

32、 INSERT INTO BOOKORDER (.) VALUES (.); INSERT INTO ORDER_POSITION (.) VALUES (.); 評(píng)估一本書(shū)的一個(gè)顧客: INSERT INTO RATING (.) VALUES (.); 改變一份訂單的狀態(tài): UPDATE BOOKORDER SET STATUS=. WHERE ORDER_NO=.; 然后,能生成下列報(bào)表: 書(shū)籍列表: SELECT * FROM BOOK; 顧客列表: SELECT * FROM CUSTOMER; 正在投遞的交貨表,按狀態(tài)排序: SELECT * FROM BOOKORDER ORDE

33、R BY STATUS; 書(shū)籍的利潤(rùn)額,最后有平均值: SELECT RETAIL_PRICE-WHOLESALE_PRICE FROM BOOK; SELECT AVG(RETAIL_PRICE-WHOLESALE_PRICE) FROM BOOK; 書(shū)評(píng)、評(píng)級(jí)和為一本書(shū)的平均評(píng)級(jí): SELECT * FROM RATING WHERE ARTICLE_NO=.; SELECT AVG(SCORE) FROM RATING WHERE ARTICLE_NO=.; 將客戶帶入PostgreSQL的生活 關(guān)于用C編程PostgreSQL的好處是你能使用嵌入式SQL。(而且,至少我喜歡它)它不是很

34、好地文檔化,但是ESQL預(yù)處理器ecpg運(yùn)行并能產(chǎn)生PostgreSQL接口代碼就好。Sql 的定式思維方法有時(shí)妨礙了我;但是,開(kāi)發(fā)客戶程序并不是很難的。 我說(shuō)過(guò)“不是很好地文檔化”嗎?那是一個(gè)保守說(shuō)法。否則PostgreSQL完整的HTML 文檔在這方面非常缺乏。我從書(shū)本得到的ESQL知識(shí)是初級(jí)的,而且聯(lián)機(jī)文檔沒(méi)幫助太多,因此我不得不自己了解如何由ecpg將C的變量強(qiáng)制轉(zhuǎn)換為NUMERIC值-還有其他東西,而且,ESQL預(yù)處理器不是很詳細(xì),且無(wú)論何時(shí)它碰到任何小錯(cuò)誤,總是似乎完全釋放出來(lái),這對(duì)任何從事又長(zhǎng)期準(zhǔn)備的項(xiàng)目的人來(lái)說(shuō)將是一個(gè)持久戰(zhàn)。 在編程PostgreSQL的客戶程序時(shí),我碰到了一

35、些小錯(cuò)誤。例如,如果文檔記錄是可能的話,在聲明一個(gè)光標(biāo)(cursor)時(shí),ecpg將不接受一個(gè) FOR READ ONLY子句 。ORDER BY子句甚至沒(méi)被實(shí)現(xiàn)。我遇見(jiàn)的問(wèn)題大都ecpg預(yù)處理器有關(guān)。Postgres有一個(gè) C API(不管怎么說(shuō),ESQL需要被編譯進(jìn)一些東西),它可能是優(yōu)秀的,但是我沒(méi)使用它(這就是生活)。當(dāng)有ESQL時(shí),我準(zhǔn)備使用ESQL。 這是摘自postgres-client.pgc的list_books()函數(shù): void list_books(void) EXEC SQL BEGIN DECLARE SECTION; int article_no; char au

36、thor_first_names30; char author_last_names30; char title30; char isbn14; int wholesale_price; int retail_price; int copies_available; EXEC SQL END DECLARE SECTION; EXEC SQL DECLARE book_cursor CURSOR FOR SELECT ARTICLE_NO, AUTHOR_FIRST_NAMES, AUTHOR_LAST_NAMES, TITLE, ISBN, WHOLESALE_PRICE, RETAIL_P

37、RICE, COPIES_AVAILABLE FROM BOOK; EXEC SQL OPEN book_cursor; while (1) EXEC SQL FETCH NEXT FROM book_cursor INTO :article_no, :author_first_names, :author_last_names, :title, :isbn, :wholesale_price, :retail_price, :copies_available; if (sqlca.sqlcode = 100) /* 100 = NOT FOUND */ break; /* bail out

38、*/ printf(nArticle no. %dn, article_no); printf(%s, %s:n, author_last_names, author_first_names); printf( %s (%s)n, title, isbn); printf(Bought at %d; selling at %d; %d copies availablenn, wholesale_price, retail_price, copies_available); ; EXEC SQL CLOSE book_cursor; 代碼是相當(dāng)直觀。它聲明一些宿主變量,在一個(gè)BEGIN/END

39、DECLARE SECTION構(gòu)造中包裝聲明,打開(kāi)一個(gè)SELECT光標(biāo)查詢,并且然后一行一行地取到宿主變量中,光標(biāo)然后關(guān)閉。 我使用了更舊的, 遭到一致反對(duì)的sqlcode變量而不是更現(xiàn)代的sqlstate,因?yàn)檫@種方式更容易檢查一個(gè)NOT FOUND情形。 把客戶帶入MySQL的生活 Mysql的C API是相當(dāng)易用的。核心元素是包含有關(guān)數(shù)據(jù)庫(kù)連接的信息和其狀態(tài)的結(jié)構(gòu),它通過(guò)連接MySQL服務(wù)器進(jìn)行初始化。該結(jié)構(gòu)的一根指針必須被傳遞給所有的 MySQL 客戶函數(shù)。 查詢以字符串提交;這意味著一個(gè)人必須處理 C 字符串變換功能,包含空字節(jié)(0) 的數(shù)據(jù)應(yīng)該能使用,情況變得更復(fù)雜了,因?yàn)殡S后傳遞

40、了一個(gè)計(jì)數(shù)字符串而不是一個(gè) C字符串。 為了獲取查詢結(jié)果,一個(gè)指向MYSQL_RES結(jié)構(gòu)的指針和一個(gè)數(shù)值變量用適當(dāng)?shù)?API 函數(shù)初始化,然后將一行取進(jìn)一個(gè)MYSQL_ROW變量,它是一個(gè)字符串?dāng)?shù)組,直接將結(jié)果放進(jìn)整數(shù)變量,就像Postgresql的ESQL的實(shí)現(xiàn)能做的那樣,但這是不可能的,結(jié)果緩沖區(qū)隨后被釋放。只要你能理解,語(yǔ)義幾乎與在ESQL使用光標(biāo)相同。 list_books(void) int count; MYSQL_RES *result; mysql_query(&bookstore, SELECT ARTICLE_NO, AUTHOR_FIRST_NAMES,AUTHOR_LA

41、ST_NAMES, TITLE, ISBN, WHOLESALE_PRICE, RETAIL_PRICE,COPIES_AVAILABLE FROM BOOK); result = mysql_store_result(&bookstore); for(count = mysql_num_rows(result); count 0; count-) MYSQL_ROW record; record = mysql_fetch_row(result); printf(nArticle no. %sn, record0); printf(%s, %s:n, record2, record1); p

42、rintf( %s (%s)n, record3, record4); printf(Bought at %s; selling at %s; %s copies availablenn, record5, record6, record7); ; mysql_free_result(result); mysql_free_result ( 結(jié)果 ); API函數(shù)簡(jiǎn)明扼要,但足夠了, Texinfo格式的文檔作為Mysql文檔的主要來(lái)源。把客戶帶入mSQL的mSQL和Mysql C API 之間的差別非常非常小。這樣, 甚至可能有一個(gè)自動(dòng)變換器。主要的差別是: mSQL 不存儲(chǔ)連接數(shù)據(jù)塊, 僅

43、存一個(gè)數(shù)字(int bookstore) 一些 mSQL 函數(shù)不拿連接作為一個(gè)參數(shù) mSQL 函數(shù)名字是Pascal風(fēng)格(他們使用大寫(xiě)首字符而不是下劃線) 方便的MONEY數(shù)據(jù)類型是一個(gè)有2個(gè)的十進(jìn)制位的固定精度小數(shù)類型。為了使mSQL正確地在MONEY列中將分幣(cent)存入整數(shù)數(shù)字里,我需要轉(zhuǎn)換他們,強(qiáng)制到float,分離他們并且在add_new_book()函數(shù)中的sprintf語(yǔ)句格式化他們。 這是list_books(), 移植到 mSQL : void list_books(void) int count; m_result *result; msqlQuery(bookstor

44、e, SELECT ARTICLE_NO, AUTHOR_FIRST_NAMES,AUTHOR_LAST_NAMES, TITLE, ISBN, WHOLESALE_PRICE, RETAIL_PRICE,COPIES_AVAILABLE FROM BOOK); result = msqlStoreResult(); for(count = msqlNumRows(result); count 0; count-) m_row record; record = msqlFetchRow(result); printf(nArticle no. %sn, record0); printf(%s,

45、 %s:n, record2, record1); printf( %s (%s)n, record3, record4); printf(Bought at %s; selling at %s; %s copies availablenn, record5, record6, record7); ; msqlFreeResult(result); mSQL的 C API文檔可以在mSQL 手冊(cè)里找到,它以PostScript和一個(gè)大的HTML文件與mSQL一起發(fā)行。 一些早期結(jié)論 所有這3個(gè)討論的數(shù)據(jù)庫(kù)系統(tǒng)是相當(dāng)容易安裝、設(shè)置和編程。實(shí)現(xiàn)C API的客戶庫(kù)是很小的;與現(xiàn)今的比如GUI工具箱,

46、他們的大小是可以忽略的,并且在客戶程序的二進(jìn)制大小或存儲(chǔ)器足跡(footprint)沒(méi)有太大的差別。 Postgresql的ESQL API的不斷增加的冗長(zhǎng)和更長(zhǎng)的準(zhǔn)備時(shí)間通過(guò)少花些精力在轉(zhuǎn)換字符串到非字符串后反過(guò)來(lái)進(jìn)行彌補(bǔ)。 到目前為止, 我沒(méi)有說(shuō)過(guò)任何關(guān)于性能的事情。我將在這個(gè)系列的下一部分做深入研究。 評(píng)估大量因素 我們將要在中途改變方向。在這部分,我將涉及與性能無(wú)關(guān)的話題。在下一個(gè)并且是最后一部分,我將全面研究基準(zhǔn)測(cè)試并以最終結(jié)論結(jié)束。 一般差別 不同于PostgreSQL,MySQL和mSQL不是真正的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)。我看到有人在新聞組里把MySQL稱為“只是一個(gè)快速存儲(chǔ)工具”,并且mSQL甚至被稱為了一個(gè)玩具-不敢恭維。至少mSQL實(shí)現(xiàn)了部分一個(gè)完整的SQL DBM應(yīng)該提供的功能。 如果一個(gè)人需要一個(gè)真實(shí)的RDBMS,三者中唯一可行的選擇是PostgreSQL。如果計(jì)算原始的性能表現(xiàn),特別是如果對(duì)數(shù)據(jù)庫(kù)所做的存取并不復(fù)雜并且大多數(shù)是自動(dòng)的,一個(gè)更小的系統(tǒng)可能更好一些。因此,mSQL和MySQL被宣傳為網(wǎng)數(shù)據(jù)庫(kù)系統(tǒng)。 許可證PostgreSQL以一個(gè)B

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論