陳英達(dá), 黃巨濤, 林強(qiáng), 唐亮亮
(廣東電網(wǎng)有限責(zé)任公司信息中心,廣東 廣州 510080)
在信息系統(tǒng)開(kāi)發(fā)中普遍采用Oracle、MySQL等關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng),而數(shù)據(jù)庫(kù)的邏輯設(shè)計(jì)好壞影響著數(shù)據(jù)庫(kù)及其應(yīng)用系統(tǒng)的整體性能,決定了數(shù)據(jù)的完整性、準(zhǔn)確性和一致性能否得到保證。如果數(shù)據(jù)庫(kù)邏輯設(shè)計(jì)不合理,那么數(shù)據(jù)庫(kù)的調(diào)優(yōu)對(duì)于數(shù)據(jù)庫(kù)的性能提升將十分有限。因此我們對(duì)數(shù)據(jù)庫(kù)的邏輯設(shè)計(jì)規(guī)范開(kāi)展研究,通過(guò)對(duì)數(shù)據(jù)庫(kù)邏輯設(shè)計(jì)提出相應(yīng)的要求與建議。遵照本文所制定的數(shù)據(jù)庫(kù)邏輯設(shè)計(jì)規(guī)范可以減少數(shù)據(jù)庫(kù)中數(shù)據(jù)冗余、提高數(shù)據(jù)庫(kù)存儲(chǔ)效率[1]。對(duì)數(shù)據(jù)定義恰當(dāng)?shù)募s束條件,并能提升SQL語(yǔ)句執(zhí)行效率,對(duì)信息系統(tǒng)的長(zhǎng)期穩(wěn)定運(yùn)行具有重要的價(jià)值。
數(shù)據(jù)完整性需要使用不同的完整性約束條件來(lái)制約,數(shù)據(jù)設(shè)計(jì)的完整性約束主要包含以下四方面:域的完整性、實(shí)體完整性、參照完整性以及用戶定義完整性,其含義分別如下。
(1) 域的完整性:數(shù)據(jù)庫(kù)表中的字段必須滿足某種特定的數(shù)據(jù)類型或約束。約束包括取值范圍、精度等規(guī)定;
(2) 實(shí)體完整性:表中行主鍵的約束;
(3) 參照完整性:屬于表間規(guī)則,用于設(shè)計(jì)表間數(shù)據(jù)的完整性;
(4) 用戶定義完整性:對(duì)數(shù)據(jù)表中字段屬性的約束。
數(shù)據(jù)完整性設(shè)計(jì)規(guī)范有如下要求。
(1) 每張表必須定義主鍵;
(2) 某一字段如果為另一表的主鍵,則該字段應(yīng)定義為外鍵;
(3) 表中字段的類型定義必須與其實(shí)際含義和可能的值匹配;
(4) 對(duì)表中的字段應(yīng)根據(jù)實(shí)際使用要求對(duì)字段屬性進(jìn)行約束,如非空、唯一性約束等;
(5) 如某一字段值需滿足特定要求,例如有特定的取值范圍等,則應(yīng)為其定義合適的約束條件。
依托大量的數(shù)據(jù)庫(kù)分析與設(shè)計(jì)實(shí)踐,總結(jié)出表邏輯設(shè)計(jì)的規(guī)范如下:
(1) 應(yīng)采用第三范式(3NF)的設(shè)計(jì)方法,最大化保證數(shù)據(jù)的完整性[2]。
(2) Oracle數(shù)據(jù)庫(kù)中,對(duì)周期性插入大批量數(shù)據(jù)操作的表或?qū)χ芷谛越⒌拇蟊?數(shù)據(jù)文件大于300M),INITIAL EXTENT應(yīng)設(shè)置成首次操作數(shù)據(jù)量的大小。具體如下。
建議把INITIAL EXTENT設(shè)置成等于NEXT EXTENT的大小;
表的EXTENTS次數(shù)盡量不超過(guò)200次;
對(duì)于不發(fā)生變化的表:PCTUSED設(shè)置為90,PCTFREE設(shè)置為5;
對(duì)于并非頻繁變化的表:PCTUSED設(shè)置為80,PCTFREE設(shè)置為5;
對(duì)于經(jīng)常變化的表(插入與更新操作均較頻繁):PCTUSED設(shè)置為60,PCTFREE設(shè)置為20;
對(duì)于僅插入操作頻繁但不經(jīng)常修改原有記錄的表:PCTUSED設(shè)置為80,PCTFREE設(shè)置為10;
對(duì)于更新操作頻繁的表:PCTUSED設(shè)置為50,PCTFREE設(shè)置為40;
對(duì)于DB_BLOCK_SIZE>=8192的OLTP(聯(lián)機(jī)事務(wù)處理過(guò)程)數(shù)據(jù)庫(kù)信息系統(tǒng),表及索引應(yīng)設(shè)定為INITRANS>=4,MAXTRANS>=10。
(3) 對(duì)于頻繁使用的表(如字典表),在內(nèi)存空閑空間較多且數(shù)據(jù)量不大(如不超1000行)時(shí),可采用緩存的方式保存,提升表的使用性能。
(4) 創(chuàng)建表時(shí)需指定到相應(yīng)的數(shù)據(jù)表空間,確保不同數(shù)據(jù)存儲(chǔ)在不同的表空間。
(5) 主鍵字段個(gè)數(shù)不能過(guò)多,盡量不修改主鍵值。
(6) 在數(shù)據(jù)庫(kù)中實(shí)現(xiàn)數(shù)據(jù)完整性的校驗(yàn),避免在應(yīng)用中對(duì)數(shù)據(jù)進(jìn)行完整性校驗(yàn)。
(7) 避免使用字符類型存放時(shí)間或日期類數(shù)據(jù)。
(8) 避免使用字符類型存放數(shù)值類型的數(shù)據(jù)。
(9) 避免表中字段數(shù)值類型直接使用INT型,應(yīng)明確寫(xiě)明字段的取值范圍,如NUMBER(8)。
(10) 應(yīng)盡量減少使用大字段,如BLOB,CLOB,LONG,TEXT與IMAGE等。
隨著表中數(shù)據(jù)量不斷增大,數(shù)據(jù)查詢的速度會(huì)逐漸降低,從而導(dǎo)致應(yīng)用系統(tǒng)的性能下降,此時(shí)應(yīng)考慮對(duì)表進(jìn)行分區(qū)操作。
表分區(qū)具有以下優(yōu)點(diǎn)。
(1) 提升查詢性能:分區(qū)對(duì)象的查詢可以僅查詢與自己相關(guān)的分區(qū),不用再對(duì)整表進(jìn)行查詢,從而提高查詢效率;
(2) 減少故障損失:表的某個(gè)分區(qū)發(fā)生故障時(shí)不會(huì)影響該表其他分區(qū)的正常使用;
(3) 維護(hù)效率高:只需對(duì)故障分區(qū)進(jìn)行修復(fù),不用對(duì)整表修復(fù);
表分區(qū)設(shè)計(jì)的規(guī)范與建議如下。
(4) 應(yīng)對(duì)有需要的大表進(jìn)行分區(qū),以提高性能和可維護(hù)性;
(5) 當(dāng)表的大小接近或超過(guò)4GB時(shí),可考慮對(duì)其進(jìn)行分區(qū);
(6) 對(duì)于OLTP系統(tǒng),當(dāng)表的數(shù)據(jù)量非常龐大時(shí),應(yīng)考慮對(duì)表進(jìn)行分區(qū),對(duì)于硬件性能較好的服務(wù)器,可適度放寬要求;
(7) 對(duì)經(jīng)常執(zhí)行并行操作的表,建議對(duì)其進(jìn)行分區(qū)。
數(shù)據(jù)庫(kù)分區(qū)表的基本類型可分如下4類:
范圍分區(qū)。范圍分區(qū)以表中分區(qū)字段的值的范圍來(lái)作為分區(qū)的劃分條件。不同的記錄將按照分區(qū)字段的值的不同,存放在對(duì)應(yīng)在的范圍分區(qū)中。該分區(qū)方式最適用于查詢條件中對(duì)分區(qū)鍵值進(jìn)行區(qū)間查詢的場(chǎng)景;
哈希分區(qū)。哈希分區(qū)將表中數(shù)據(jù)的存放位置依據(jù)分區(qū)字段的值進(jìn)行特定的哈希計(jì)算后得到的結(jié)果來(lái)決定,該分區(qū)方式最適用于查詢條件中對(duì)分區(qū)字段采用等號(hào)進(jìn)行比較的情況[3];
列表分區(qū)。與范圍分區(qū)不同,列表分區(qū)必須指定分區(qū)字段的具體值而不僅僅是一個(gè)范圍。該分區(qū)的使用范圍比范圍分區(qū)和哈希分區(qū)??;
組合分區(qū)。通過(guò)在不同字段上,使用“范圍分區(qū)”、 “哈希分區(qū)”以及“列表分區(qū)”的不同組合方式,實(shí)現(xiàn)組合分區(qū)。該分區(qū)適用于數(shù)據(jù)量大的表以及對(duì)性能具有特殊要求的情況。
對(duì)表中字段的邏輯設(shè)計(jì)規(guī)范如下。
(1) 應(yīng)對(duì)通信地址等特定的信息采用多個(gè)字段來(lái)表示,增加靈活性;
(2) 應(yīng)使用角色實(shí)體來(lái)定義關(guān)聯(lián)屬性,方便創(chuàng)建時(shí)間關(guān)聯(lián)關(guān)系;
(3) 數(shù)字類型與文本類型的字段長(zhǎng)度應(yīng)保證充足;
(4) 對(duì)刪除記錄的操作需用統(tǒng)一的特定字段標(biāo)注,而非直接刪除記錄;
(5) 盡量避免使用大字段。
在設(shè)計(jì)關(guān)系型系統(tǒng)的數(shù)據(jù)庫(kù)時(shí),通常需要?jiǎng)?chuàng)建大量索引,良好的索引可以加快表與表之間的連接[4],通常能顯著減少?gòu)?fù)雜的SQL查詢所花費(fèi)的時(shí)間,從而提升數(shù)據(jù)庫(kù)系統(tǒng)的性能[5]。
創(chuàng)建索引應(yīng)遵循如下規(guī)范。
(1) 不要索引大型字符字段;
(2) 不要索引常用的小型表;
(3) DML操作頻繁的表應(yīng)盡量少建索引;
(4) 盡量不要將經(jīng)常修改的字段作為索引字段;
(5) 選擇性高的字段適合建立索引;
(6) 如某一字段或字段組合經(jīng)常在WHERE子句中使用并且滿足該字段或字段組合查詢條件的行數(shù)占表總行數(shù)的比例小于等于5%時(shí),適合創(chuàng)建索引;
(7) 應(yīng)在頻繁使用DISTINCT關(guān)鍵字查詢的字段上建立索引;
(8) 進(jìn)行表連接時(shí),應(yīng)在連接字段上建立索引;
(9) 復(fù)合索引創(chuàng)建時(shí)應(yīng)把最常用的字段放在第一位,而將不常用的字段排后;
(10) 當(dāng)索引字段的記錄重復(fù)較多而DISTINCT記錄值又較少(一般少于30)時(shí),應(yīng)建立位圖索引;
(11) 盡量避免對(duì)OLTP系統(tǒng)的一張數(shù)據(jù)庫(kù)表創(chuàng)建過(guò)多索引,例如超過(guò)10個(gè);
(12) 由于位圖索引會(huì)影響DML操作的速度,因此OLTP系統(tǒng)中盡量不使用位圖索引;
(13) 如查詢中需使用函數(shù),且滿足該查詢條件的記錄數(shù)比例很小,建議創(chuàng)建相應(yīng)的函數(shù)索引;
創(chuàng)建索引完畢后,正確使用索引才能使其發(fā)揮作用,使用索引的規(guī)范如下。
(1) 確認(rèn)是否已使用索引。應(yīng)盡量使用選擇率高的索引,避免全表掃描;
(2) 確認(rèn)已使用的索引是否合理。錯(cuò)誤的索引將導(dǎo)致性能的降低。索引的合理使用規(guī)范如下:
應(yīng)避免在字段上進(jìn)行類型轉(zhuǎn)換操作,否則無(wú)法使用該字段上的索引;
避免對(duì)索引字段進(jìn)行任何計(jì)算操作,對(duì)索引字段的計(jì)算操作會(huì)引起索引的失效;
盡可能增加查詢的條件,限制全范圍的查詢
當(dāng)索引效率很低時(shí),應(yīng)避免使用索引;
盡量避免模糊查詢,如必須使用模糊查詢時(shí),盡量使用前端匹配的模糊查詢;
WHERE條件中對(duì)索引字段盡量使用等值“=”進(jìn)行比較查詢;
盡量使用前導(dǎo)字段(復(fù)合索引的首字段)作為查詢條件;
WHERE條件中對(duì)索引字段的查詢條件應(yīng)保證比較值的類型和字段類型一致。
索引在創(chuàng)建和維護(hù)過(guò)程中需注意如下事項(xiàng)。
(1) 創(chuàng)建索引時(shí)數(shù)據(jù)和索引應(yīng)放在不同的表空間;
(2) 創(chuàng)建分區(qū)表索引時(shí),盡量創(chuàng)建本地索引;
(3) 對(duì)于經(jīng)常執(zhí)行刪除操作的表上的索引應(yīng)定期重建索引。由于索引重建時(shí)會(huì)阻塞DML操作,應(yīng)選擇在業(yè)務(wù)空閑時(shí)進(jìn)行,盡量減少其對(duì)業(yè)務(wù)產(chǎn)生影響;
(4) 對(duì)于鍵值頻繁更新的索引,也應(yīng)定期進(jìn)行重建;
(5) 刪除無(wú)用的索引,避免多余索引降低數(shù)據(jù)庫(kù)DML操作的執(zhí)行速度。
關(guān)系型數(shù)據(jù)庫(kù)是信息應(yīng)用系統(tǒng)的核心組成部分,不合理的關(guān)系型數(shù)據(jù)庫(kù)設(shè)計(jì)會(huì)加大編程難度,引起操作繁瑣、性能降低、空間浪費(fèi)等不良后果,甚至影響應(yīng)用系統(tǒng)的安全與穩(wěn)定,合理設(shè)計(jì)關(guān)系型數(shù)據(jù)庫(kù)十分有必要。而邏輯結(jié)構(gòu)的設(shè)計(jì)是關(guān)系型數(shù)據(jù)庫(kù)設(shè)計(jì)過(guò)程中的重要環(huán)節(jié),邏輯結(jié)構(gòu)設(shè)計(jì)的好壞直接決定并影響了數(shù)據(jù)的完整性、準(zhǔn)確性與一致性,因此在關(guān)系型數(shù)據(jù)庫(kù)邏輯設(shè)計(jì)過(guò)程中研究并提出相應(yīng)的規(guī)范具有重大價(jià)值。
[1] 陶勇,丁維明. 數(shù)據(jù)庫(kù)中規(guī)范化與反規(guī)范化設(shè)計(jì)的比較與分析[J]. 計(jì)算機(jī)技術(shù)與發(fā)展, 2006,16(4):107-109.
[2] 丁智斌,石浩磊. 關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)與規(guī)范化[J]. 計(jì)算機(jī)與數(shù)字工程, 2005,33(2):114-116.
[3] 韋平飛. 移動(dòng)業(yè)務(wù)運(yùn)營(yíng)支撐系統(tǒng)數(shù)據(jù)庫(kù)性能優(yōu)化的研究[D]. 廣州:華南理工大學(xué), 2011.
[4] 王力等. 基于免疫遺傳算法的關(guān)系型數(shù)據(jù)庫(kù)查詢優(yōu)化技術(shù)[J]. 微型電腦應(yīng)用, 2008,24(3):45-47.
[5] 張若唯. 基于ORACLE的煉鋼—連鑄綜合優(yōu)化系統(tǒng)信息平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 沈陽(yáng):東北大學(xué), 2012.