鄒同浩 許學添
(廣東司法警官職業(yè)學院 廣東省廣州市 510520)
在數(shù)據(jù)庫設計的過程中,經(jīng)常遇到對于同類事物需要的信息不一樣,為解決這一問題,需要針對不同的事物設計不同的數(shù)據(jù)表,數(shù)據(jù)表之間通過關鍵字段確定多種內(nèi)聯(lián)關系。如果把不同的事物放在同一張數(shù)據(jù)表中,不同的事物有不同的屬性,這樣創(chuàng)建一張表就很難進行輸入和管理。例如,把人和物存在同一張表格內(nèi),人的屬性有“性別”,而物沒有這樣的屬性,存在同一張表中,很多字段對于彼此都是無效字段,增加了計算機處理負荷,從而暴露出數(shù)據(jù)庫設計的龐大和復雜性。本文指出用split()函數(shù)減少數(shù)據(jù)庫設計中的多表性和內(nèi)聯(lián)性,降低數(shù)據(jù)庫設計的復雜性 ,盡最大可能的把不同的信息存儲設計在同一張數(shù)據(jù)表中,減少表的數(shù)據(jù)表的數(shù)量和降低數(shù)據(jù)之間關聯(lián)性,提高數(shù)據(jù)的設計效率,降低數(shù)據(jù)庫的管理復雜度。
Split 函數(shù)是編程語言中使用于分割字符串一種函數(shù),它返回一個下標從零開始的一維數(shù)組。它是在邏輯上對輸入數(shù)據(jù)進行的分割,并不會在磁盤上將其切割成片存儲[1]。
Split 函數(shù)格式:Split(expression[,delimiter [,count[, ompare]]])。如果用“.”作為分隔的話,必須寫法,String.split("\."),這樣才能正確的分隔開,不能用String.split(".");如果用“|”作為分隔的話,寫法,String.split("\|"),這樣才能正確的分隔開;“.”和“|”都是轉義字符,必須得加"\";如果在一個字符串中有多個分隔符,可以用“|”作為連字符,比如,“acount=? and uu =? or n=?”,把三個都分隔出來,可以用String.split("and|or");
使用String.split 方法分隔字符串時,分隔符如果用到一些特殊字符,可能會得不到我們預期的結果。
在數(shù)據(jù)庫設計的過程中,程序開發(fā)人員結合數(shù)據(jù)庫的設計和程序設計中Split()函數(shù)特點,取長補短,優(yōu)化數(shù)據(jù)庫的設計,目標是降低數(shù)據(jù)庫設計的復雜性和內(nèi)聯(lián)性。
程序員在數(shù)據(jù)庫設計過程中,遇到同一個物品,數(shù)據(jù)表需要的字段不一樣,給數(shù)據(jù)表的建立增加非常多的統(tǒng)計表格。或者物品較多,但統(tǒng)計量有很少,增加數(shù)據(jù)表的設計數(shù)量,又顯得多余。還要通過設置主鍵和外鍵進行關聯(lián),這樣會增加數(shù)據(jù)庫的復雜度。我們試想,能否把數(shù)據(jù)放在一張數(shù)據(jù)表中,一張數(shù)據(jù)表能把所有物品的數(shù)據(jù)信息存儲下來,共查詢和統(tǒng)計。數(shù)據(jù)庫設計時能否利用split()函數(shù)的字符分割功能解決這些問題。
在開發(fā)固定資產(chǎn)管理系統(tǒng)時,物品種類幾千種,屬性參數(shù)各不相同,在建立數(shù)據(jù)庫時可能要幾千個數(shù)據(jù)表。例如,臺式計算機的參數(shù)有系統(tǒng)、CPU 型號、內(nèi)存、主板等;辦公椅的參數(shù)有類別、扶手類型、五星腳材質(zhì)等,如果把這樣的物品放在同一張數(shù)據(jù)表中,會出這樣的情況,如表1 所示。

表1:匯總表

表2:拆分表1

表3:拆分表2

表4:改造后的匯總表

表5:成績表
這樣設計出來的數(shù)據(jù)表,冗余量太大,對于同一物品無效字段太多、數(shù)據(jù)表字段太多等一系列問題。查詢物品的信息相互關聯(lián)時,是否能夠合并作為一個字段,需要統(tǒng)計的公用信息可以單列字段,這樣就減少數(shù)據(jù)表的設計復雜性。假設對不同類物品單列一張數(shù)據(jù)表如表2、表3 所示。
這樣精煉了數(shù)據(jù)表中的字段項,但增加了數(shù)據(jù)表的數(shù)量。后期會增加程序設計的復雜性。因此,我們考慮,根據(jù)用戶的需求,比如一鍵查詢出某個物品的所有信息,而不是單個信息。或者說,查詢某個物品的單個信息和整個信息時等價的,或者沒有實在意義,是否能通過程序設計,可以使數(shù)據(jù)庫的表的數(shù)量最少,還能滿足系統(tǒng)需求。
例如,在固定資產(chǎn)管理系統(tǒng)中,注重的是產(chǎn)品的存在及價值,對于具體參數(shù)不是統(tǒng)計重點,我們是否考慮不同的物品的參數(shù)僅僅用一個字段表示,如“參數(shù)說明”。數(shù)據(jù)表可以設計如表4 所示。
這樣的數(shù)據(jù)庫設計方法應用必須滿足兩個條件。第一該物品字段統(tǒng)計字段次不齊或無統(tǒng)計價值;第二可以大大降低數(shù)據(jù)庫中數(shù)據(jù)表的數(shù)量。數(shù)據(jù)表這樣的設計,會出現(xiàn)統(tǒng)計量統(tǒng)計的問題,我們通過程序設計中Split()函數(shù)可以解覺數(shù)據(jù)表數(shù)量與程序設計的問題[2]。例如通過split()函數(shù)可以吧表4 中的“參數(shù)說明”的字段信息通過split()函數(shù)進行拆分提取,分別以“:”和“;”進行拆分。當然我們可以根據(jù)統(tǒng)計需要以不同的符號代表進行多次拆分。利用String 類中的split 函數(shù)進行分割,同時將結果存放在一個二維數(shù)組中。問題在于怎么利用兩次split 分割后放在數(shù)組的兩個維度中,過程不再撰述。數(shù)組為引用型,需要申請內(nèi)存。

通過程序設計中split()函數(shù)字符串的分割功能,可以吧數(shù)據(jù)表的存儲有固定格式的字段內(nèi)容提取后根據(jù)需要進行拆分,提取需要的內(nèi)容。完成統(tǒng)計功能。對于學生成績管理系統(tǒng),這種功能更能體現(xiàn)出來。一張數(shù)據(jù)表就可以解決。例如表5 如下,統(tǒng)計一下“張三”的總成績。

以上兩種通過程序設計中Split()的函數(shù)來解決數(shù)據(jù)庫的設計問題及統(tǒng)計量的問題,從而大大的降低了數(shù)據(jù)庫設計的復雜度,尤其在數(shù)據(jù)表的數(shù)量上會大大的減少,減少了數(shù)據(jù)庫的維護性[3]。僅僅在錄入數(shù)據(jù)庫時,程序上一定要做格式上的驗證,防止輸入不能被split()函數(shù)識別的問題,這點在程序設計之初,必須要考慮的。
Split()函數(shù)在數(shù)據(jù)庫設計查詢過程中,顯示其優(yōu)越性。例如,全校不同專業(yè)的學生可以放在同一張表格內(nèi),三個字段:學號、姓名、成績,在成績這個字段中,可以把學生各科成績放在同一個字段中,比如:語文:90;數(shù)學:96;英語:98;通過冒號和分號區(qū)別門課和成績。如果學生查詢總的成績時,直接查詢,如果學生查詢“語文”成績時,調(diào)用Split()函數(shù)直接單獨顯示語文成績。如統(tǒng)計總成績、平均成績等都可以通過Split()函數(shù)進行實現(xiàn)。雖然用Split()函數(shù)可以提高數(shù)據(jù)的設計效率,但其的開銷比較大,因此Split()函數(shù)比較適合較小規(guī)模的數(shù)據(jù)庫設計,而且對服務器的要求比較高。
Split()函數(shù)的在數(shù)據(jù)庫設計的應用必然會增加程序的計算效率。程序中用到for 循環(huán)嵌套,時間復雜度達到O(n2)。文中提到split()函數(shù)在計算機上僅僅是邏輯分割,并不會在磁盤上將其切割成片存儲這樣對服務器的性能要求就會提高,增加了服務器的符合。如果通過增加數(shù)據(jù)表的方法來開發(fā),程序的復雜度可以達到O(n),但數(shù)據(jù)庫的維護復雜度就會增加[4]。
在字符串截取字符串應用方面,Split()函數(shù)沒有其優(yōu)越性,StringTokenizer 在截取字符串中效率最高,不論數(shù)據(jù)量大小,幾乎持平。SubString 則要次之,數(shù)據(jù)量增加耗時也要隨之增加。Split()函數(shù)則是表現(xiàn)一般,究其原因,split 的實現(xiàn)方式是采用正則表達式實現(xiàn),所以其性能會比較低。
在字符串拆分應用方面,以看出Split()方法比StringTokenizer類的拆分方法更加簡潔和方便后續(xù)處理。Split()方法可以匹配正則表達式,而StringTokenizer 則不行。且大多數(shù)時候拆分得到的子字符串是要進行操作的,而StringTokenizer 類操作子字符串是靠遍歷進行的,比較繁瑣,相比之下運用數(shù)組進行下標操作就方便多了,事實上官方也不推薦用StringTokenizer 類生成對象的方法來進行字符串的拆分操作了。
根據(jù)用戶規(guī)模和實際需求,尋求數(shù)據(jù)庫設計方法,重效率還是重管理,數(shù)據(jù)庫有不同的設計方法。同一張數(shù)據(jù)表中,關聯(lián)性強的屬性可以合并后存入同一字段中,需要統(tǒng)計字段可以單列出來建立字段,這樣只要折中找出一個最優(yōu)點,就可以減少數(shù)據(jù)表內(nèi)冗余,減少數(shù)據(jù)庫中數(shù)據(jù)表的數(shù)量和數(shù)據(jù)表間的關聯(lián)程度。對于合并項,可以利用Split()函數(shù)進行分割提取,因Split()函數(shù)開銷較大,但目前隨著服務器性能的提高及云服務能力的急速提升,開銷已不是主要考慮的問題,降低數(shù)據(jù)庫設計的復雜度和內(nèi)聯(lián)性是我們考慮的重點問題。