大數據資料庫設計
① 大數據下的地質資料信息存儲架構設計
頡貴琴 胡曉琴
(甘肅省國土資源信息中心)
摘要 為推進我國地質資料信息服務集群化產業化工作,更大更好地發揮地質資料信息的價值,本文針對我國現有的地質資料信息集群化共享服務平台存在的缺陷和問題,基於現有系統的存儲架構,設計了一種大數據下的地質資料信息存儲架構,以便於我國地質資料信息服務集群化產業化工作能夠適應大數據時代的數據存儲。
0 引言
新中國成立60多年來,我國形成了海量的地質資料信息,為國民經濟和社會發展提供了重要支撐。但在地質資料管理方面長期存在資料信息分散、綜合研究不夠、數字化信息化程度不高、服務渠道不暢、服務能力不強等問題,使地質資料信息的巨大潛在價值未能得到充分發揮。為進一步提高地質工作服務國民經濟和社會發展的能力,充分發揮地質資料信息的服務功能,擴大服務領域,國土資源部根據國內外地質工作的先進經驗,做出了全面推進地質資料信息服務集群化產業化工作的部署。
目前,全國各省地質資料館都在有條不紊地對本省成果、原始和實物地質資料進行清理,並對其中重要地質資料進行數字化和存儲工作。然而,由於我國地質資源豐富,經過幾十年的積累,已經形成了海量的地質資料,數據量早已經超過了幾百太位元組(TB)。在進行地質資料信息服務集群化工作中,隨著共享數據量的不斷增大,傳統的數據存儲方式和管理系統必然會展現出存儲和檢索方面的不足以及系統管理方面的缺陷。為了解決該問題,需要設計更加先進的數據存儲架構來實現海量地質資料的存儲。
而大數據(Big Data)作為近年來在雲計算領域中出現的一種新型數據,科技工作者在不斷的研究中,設計了適合大數據存儲管理的非關系型資料庫NoSQL進行大數據的存儲和管理。本文將針對我國現有的地質資料信息集群化共享服務平台存在的缺陷和問題,利用大數據存儲管理模式的思想,提出一種海量地質資料存儲架構,改進現有系統存儲架構,以便於我國全面推進地質資料信息服務集群化產業化工作。
1 工作現狀
1.1 國內外地質資料信息的存儲現狀
在美國,主要有兩大地質資料公共服務平台,分別是地球科學信息中心(ESIC)、地球資源觀測和科學中心(EROS),其目的是通過為社會和政府提供更加便利、快速的地質信息服務。20世紀90年代初,澳大利亞出台了國家地球科學填圖協議,採用先進的科學方法和技術進行數據存儲,從而形成了第二代澳大利亞陸地地質圖。
目前,我國地質資料信息服務集群化產業化工作剛剛起步,雖然國土資源部信息中心已經開發了地質資料信息集群化共享服務平台,並倡導各地方用戶使用該系統。但由於各個地方早期的工作背景不一致,因此各地方所使用的存儲系統也不盡相同,主要有Access、SQL Server、Oracle、MySQL等系統。本文以國土資源部信息中心開發的地質資料信息集群化共享服務平台的存儲系統MySQL為例說明。該系統是基於關系資料庫管理系統MySQL的一套分布式存儲檢索系統。該系統的部署使得我國地質資料信息服務集群化產業化工作取得了重大進展,同時也為我國建立標准統一的地質資料信息共享服務平台和互聯互通的網路服務體系奠定了堅實的基礎。然而,該系統的研發並沒有考慮到地質資料信息進一步集群化以及在未來地質資料信息進入大數據時代的信息共享和存儲管理問題,也沒有給出明確的解決方案。
1.2 大數據的存儲架構介紹
大數據是近年在雲計算領域中出現的一種新型數據,具有數據量大、數據結構不固定、類型多樣、查詢分析復雜等特點。傳統關系型資料庫管理系統在數據存儲規模、檢索效率等方面已不再適合大數據存儲。NoSQL(Not Only SQL)是與關系資料庫相對的一類資料庫的總稱。這些資料庫放棄了對關系資料庫的支持,轉而採用靈活的、分布式的數據存儲方式管理數據,從而可以滿足大數據存儲和處理的需求。NoSQL基於非關系型數據存儲的設計理念,以鍵值對進行存儲,採用的數據字的結構不固定,每一個元組可以有不一樣的欄位,且每個元組可以根據自己的需要增加一些自己的鍵值對,可以減少一些檢索時間和存儲空間。目前,應用廣泛的 NoSQL 資料庫有 Google BigTable、HBase、MongoDB、Neo4 j、Infinite Graph等。
2 大數據下的地質資料信息存儲架構設計
根據國土資源部做出的全面推進地質資料信息服務集群化產業化工作的部署,國土資源部倡導全國地質資料館使用國土資源部信息中心開發的地質資料信息集群化共享服務平台,實現地質資料信息的存儲和共享。該系統採用了資料庫管理系統MySQL作為數據存儲系統。
為了與現有系統和現有的工作進行對接,並為將來地質資料進入大數據時代後的存儲工作做准備,本文設計了一種能用於海量地質資料信息存儲並且兼容MySQL的分布式的數據存儲架構(圖1)。
整個系統可以根據不同的用戶等級分為不同的用戶管理層,由於圖幅限制,在圖1 中僅僅展示了3級:國家級管理層(即共享服務平台用戶層)、省級管理層以及市級管理層(可根據實際需要延伸至縣級)。
每級管理層的每個用戶可以單獨管理一個伺服器。如國土資源部信息中心可以單獨管理一個伺服器;甘肅省國土資源信息中心可以單獨管理一個伺服器,陝西省國土資源信息中心可以單獨管理一個伺服器;甘肅的若干個市級國土資源局可以根據需要分別管理各自的伺服器。
在伺服器上分別安裝兩套資料庫管理系統,一套是原有的MySQL資料庫管理系統,另一套是為大數據存儲而配備的NoSQL型資料庫管理系統。在伺服器上還專門開發一個資料庫管理器中間件,用於進行用戶層和資料庫的通信以及兩套資料庫之間的通信。
由於各個管理層都各自維護自己的資料庫和數據。當用戶需要進行數據存儲時,他所影響的資料庫僅僅是本地資料庫,存儲效率較高;當用戶需要從多個資料庫讀取數據時,頂層的共享服務平台會根據用戶需求進行任務分解,將任務分發給下層的管理層進行資料庫讀取,由於各個資料庫並行讀取,從而提高了資料庫讀取效率。
圖1 大數據下的地質資料信息存儲架構框圖
2.1 用戶管理層
用戶管理層根據許可權范圍,分為多層(本文以3層為例)。
位於頂層的國家級管理層(共享服務平台用戶層)負責用戶訪問許可權的分配、與其直接關聯的資料庫的訪問、下級管理層任務的分配等工作。
用戶訪問許可權的分配是指為訪問本共享服務平台的個人用戶和單位用戶分配數據的使用許可權、安全性的設計等。
與其直接關聯的資料庫訪問是指直接存儲在其本地資料庫上的數據的訪問。在該資料庫中不僅要存儲所需要的地質資料,還要存儲注冊用戶信息等數據。
下級管理層任務分配是指如果用戶需要訪問多個下層資料庫,用戶只需要輸入查詢這幾個下層資料庫的命令,而如何查找下層資料庫則由該功能來完成。例如某用戶要查找甘肅、陝西、上海、北京的鐵礦分布圖,則用戶只需要輸入這幾個地方及鐵礦等查詢條件,系統將自動把各個省的資料庫查詢任務分派到下級管理層。
同理,位於下層的省級管理層和市級管理層除了沒有用戶訪問許可權功能外,其餘功能與國家級管理層是相同的。各層之間的資料庫通過互聯網相互連接成分布式的資料庫系統。
2.2 MySQL和NoSQL的融合
MySQL是關系型資料庫,它支持SQL查詢語言,而NoSQL是非關系型資料庫,它不支持SQL查詢語言。用戶要想透明地訪問這兩套資料庫,必須要設計資料庫管理器中間件,作為用戶訪問資料庫的統一入口和兩套資料庫管理系統的通信平台。本文所設計的資料庫管理器簡單模型如圖2所示。
圖2 資料庫管理器模型
伺服器管理器通過用戶程序介面與應用程序進行通訊,通過MySQL資料庫介面與MySQL伺服器通訊,通過NoSQL資料庫介面與NoSQL資料庫介面通訊。當應用程序介面接收到一條資料庫訪問命令之後,交由資料庫訪問命令解析器進行命令解析,從而形成MySQL訪問命令或者NoSQL訪問命令,通過相應的資料庫介面訪問資料庫;資料庫返回訪問結果後經過匯總,由應用程序介面返回給應用程序。
兩套資料庫可以通過雙資料庫通信協議進行相互的通信和互訪。此通信協議的建立便於地質工作人員將已經存入MySQL資料庫的不適合結構化存儲的數據轉存到NoSQL資料庫中,從而便於系統的升級和優化。
2.3 系統的存儲和檢索模式
在本存儲框架設計中,系統採用分布式網路存儲模式,即採用可擴展的存儲結構,利用分散在全國各地的多台獨立的伺服器進行數據存儲。這種方式不僅分擔了伺服器的存儲壓力,提高了系統的可靠性和可用性,還易於進行系統擴展。另外,由於地質資料信息存儲的特殊性,各地方用戶的數據存儲工作基本都是在本地伺服器進行,很少通過網路進行遠程存儲,所以數據存儲效率較高。
在一台資料庫伺服器上安裝有MySQL和NoSQL型兩套資料庫管理系統,分別用於存儲地質資料信息中的結構化數據和非結構化數據。其中,NoSQL型資料庫作為主資料庫,用於存儲一部分結構化數據和全部的非結構化數據;而MySQL資料庫作為輔助資料庫,用於存儲一部分結構化的數據,以及舊系統中已經存儲的數據。使用兩套資料庫不僅可以存儲結構化數據而且還可以適用於大數據時代地質資料信息的存儲,因此系統具有很好的適應性和靈活性。
2.4 安全性設計
地質資料信息是國家的機密,地質工作人員必須要保證它的安全。地質資料信息進入數字化時代之後,地質資料常常在計算機以及網路上進行傳輸,地質資料信息的安全傳輸和保存更是地質工作人員必須關注和解決的問題。在本存儲架構的設計中設計的安全問題主要有資料庫存儲安全、數據傳輸安全、數據訪問安全等問題。
資料庫設計時採用多邊安全模型和多級安全模型阻止資料庫中信息和數據的泄露來提高資料庫的安全性能,以保障地質信息在資料庫中的存儲安全;當用戶登錄系統訪問資料庫時,必須進行用戶甄別和實名認證,這主要是對用戶的身份進行有效的識別,防止非法用戶訪問資料庫;在對地質資料進行網路傳輸時,應該首先將數據進行加密,然後再進行網路傳輸,以防止地質信息在傳輸過程中被竊取。
3 結語
提高地質資料數字化信息化水平,是國外地質工作強國的普遍做法。為推進我國地質資料信息服務集群化產業化工作,本文針對我國現有的地質資料信息集群化共享服務平台存在的缺陷和問題,利用大數據存儲管理模式的思想,基於現有系統的存儲架構,設計了一種大數據下的地質資料信息存儲架構,以便於我國地質資料信息服務集群化產業化工作能夠適應大數據時代的數據存儲。該存儲架構的設計只涉及了簡單模型的構建,具體詳細復雜的功能設計和軟體實現還需要在進一步的研究工作中完成。
參考文獻
[1]吳金朋.一種大數據存儲模型的研究與應用[D].北京:北京郵電大學計算機學院,2012.
[2]吳廣君,王樹鵬,陳明,等.海量結構化數據存儲檢索系統[J].計算機研究與發展,2012,49(Suppl):1~5.
[3]黃
② 大型資料庫設計原則
一個好的資料庫產品不等於就有一個好的應用系統 如果不能設計一個合理的資料庫模型 不僅會增加客戶端和伺服器段程序的編程和維護的難度 而且將會影響系統實際運行的性能 一般來講 在一個MIS系統分析 設計 測試和試運行階段 因為數據量較小 設計人員和測試人員往往只注意到功能的實現 而很難注意到性能的薄弱之處 等到系統投入實際運行一段時間後 才發現系統的性能在降低 這時再來考慮提高系統性能則要花費更多的人力物力 而整個系統也不可避免的形成了一個打補丁工程 筆者依據多年來設計和使用資料庫的經驗 提出以下一些設計准則 供同仁們參考
命名的規范
不同的資料庫產品對對象的命名有不同的要求 因此 資料庫中的各種對象的命名 後台程序的代碼編寫應採用大小寫敏感的形式 各種對象命名長度不要超過 個字元 這樣便於應用系統適應不同的資料庫
游標(Cursor)的慎用
游標提供了對特定集合中逐行掃描的手段 一般使用游標逐行遍歷數據 根據取出的數據不同條件進行不同的操作 尤其對多表和大表定義的游標(大的數據集合)循環很容易使程序進入一個漫長的等特甚至死機 筆者在某市《住房公積金管理系統》進行日終帳戶滾積數計息處理時 對一個 萬個帳戶的游標處理導致程序進入了一個無限期的等特(後經測算需 個小時才能完成)(硬體環境 Alpha/ Mram Sco Unix Sybase ) 後根據不同的條件改成用不同的UPDATE語句得以在二十分鍾之內完成 示例如下
Declare Mycursor cursor for select count_no from COUNT
Open Mycursor
Fetch Mycursor into @vcount_no
While (@@sqlstatus= )
Begin
If @vcount_no= 條件
操作
If @vcount_no= 條件
操作
Fetch Mycursor into @vcount_no
End
改為
Update COUNT set 操作 for 條件
Update COUNT set 操作 for 條件
在有些場合 有時也非得使用游標 此時也可考慮將符合條件的數據行轉入臨時表中 再對臨時表定義游標進行操作 可時性能得到明顯提高 筆者在某地市〈電信收費系統〉資料庫後台程序設計中 對一個表( 萬行中符合條件的 多行數據)進行游標操作(硬體環境 PC伺服器 PII Mram NT Ms Sqlserver ) 示例如下
Create #tmp /* 定義臨時表 */
(欄位
欄位
)
Insert into #tmp select * from TOTAL where
條件 /* TOTAL中 萬行 符合條件只有幾十行 */
Declare Mycursor cursor for select * from #tmp
/*對臨時表定義游標*/
索引(Index)的使用原則
創建索引一般有以下兩個目的 維護被索引列的唯一性和提供快速訪問表中數據的策略 大型資料庫有兩種索引即簇索引和非簇索引 一個沒有簇索引的表是按堆結構存儲數據 所有的數據均添加在表的尾部 而建立了簇索引的表 其數據在物理上會按照簇索引鍵的順序存儲 一個表只允許有一個簇索引 因此 根據B樹結構 可以理解添加任何一種索引均能提高按索引列查詢的速度 但會降低插入 更新 刪除操作的性能 尤其是當填充因子(Fill Factor)較大時 所以對索引較多的表進行頻繁的插入 更新 刪除操作 建表和索引時因設置較小的填充因子 以便在各數據頁中留下較多的自由空間 減少頁分割及重新組織的工作
數據的一致性和完整性
為了保證資料庫的一致性和完整性 設計人員往往會設計過多的表間關聯(Relation) 盡可能的降低數據的冗餘 表間關聯是一種強制性措施 建立後 對父表(Parent Table)和子表(Child Table)的插入 更新 刪除操作均要佔用系統的開銷 另外 最好不要用Identify 屬性欄位作為主鍵與子表關聯 如果數據冗餘低 數據的完整性容易得到保證 但增加了表間連接查詢的操作 為了提高系統的響應時間 合理的數據冗餘也是必要的 使用規則(Rule)和約束(Check)來防止系統操作人員誤輸入造成數據的錯誤是設計人員的另一種常用手段 但是 不必要的規則和約束也會佔用系統的不必要開銷 需要注意的是 約束對數據的有效性驗證要比規則快 所有這些 設計人員在設計階段應根據系統操作的類型 頻度加以均衡考慮
事務的陷阱
事務是在一次性完成的一組操作 雖然這些操作是單個的操作 SQL Server能夠保證這組操作要麼全部都完成 要麼一點都不做 正是大型資料庫的這一特性 使得數據的完整性得到了極大的保證
眾所周知 SQL Server為每個獨立的SQL語句都提供了隱含的事務控制 使得每個DML的數據操作得以完整提交或回滾 但是SQL Server還提供了顯式事務控制語句
BEGIN TRANSACTION 開始一個事務
MIT TRANSACTION 提交一個事務
ROLLBACK TRANSACTION 回滾一個事務
事務可以嵌套 可以通過全局變數@@trancount檢索到連接的事務處理嵌套層次 需要加以特別注意並且極容易使編程人員犯錯誤的是 每個顯示或隱含的事物開始都使得該變數加 每個事務的提交使該變數減 每個事務的回滾都會使得該變數置 而只有當該變數為 時的事務提交(最後一個提交語句時) 這時才把物理數據寫入磁碟
資料庫性能調整
在計算機硬體配置和網路設計確定的情況下 影響到應用系統性能的因素不外乎為資料庫性能和客戶端程序設計 而大多數資料庫設計員採用兩步法進行資料庫設計 首先進行邏輯設計 而後進行物理設計 資料庫邏輯設計去除了所有冗餘數據 提高了數據吞吐速度 保證了數據的完整性 清楚地表達數據元素之間的關系 而對於多表之間的關聯查詢(尤其是大數據表)時 其性能將會降低 同時也提高了客 戶端程序的編程難度 因此 物理設計需折衷考慮 根據業務規則 確定對關聯表的數據量大小 數據項的訪問頻度 對此類數據表頻繁的關聯查詢應適當提高數據冗餘設計
數據類型的選擇
數據類型的合理選擇對於資料庫的性能和操作具有很大的影響 有關這方面的書籍也有不少的闡述 這里主要介紹幾點經驗
Identify欄位不要作為表的主鍵與其它表關聯 這將會影響到該表的數據遷移
Text 和Image欄位屬指針型數據 主要用來存放二進制大型對象(BLOB) 這類數據的操作相比其它數據類型較慢 因此要避開使用
日期型欄位的優點是有眾多的日期函數支持 因此 在日期的大小比較 加減操作上非常簡單 但是 在按照日期作為條件的查詢操作也要用函數 相比其它數據類型速度上就慢許多 因為用函數作為查詢的條件時 伺服器無法用先進的性能策略來優化查詢而只能進行表掃描遍歷每行
例如 要從DATA_TAB 中(其中有一個名為DATE的日期欄位)查詢 年的所有記錄
lishixin/Article/program/Oracle/201311/17929
③ 大數據量的資料庫表設計技巧
大數據量的資料庫表設計技巧
即使是一個非常簡單的資料庫應用系統,它的數據量增加到一定程度也會引起發一系列問題。如果在設計資料庫的時候,就提前考慮這些問題,可以避免由於系統反映遲緩而引起的用戶抱怨。
技巧1:盡量不要使用代碼。比如性別這個欄位常見的做法:1代表男,0代表女。這樣的做法意味著每一次查詢都需要關聯代碼表。
技巧2:歷史數據中所有欄位與業務表不要有依賴關系。如保存列印發票的時候,不要只保留單位代碼,而應當把單位名稱也保存下來。
技巧3:使用中間表。比如職工工資,可以把每一位職工工資的合計保存在一張中間表中,當職工某一工資項目發生變化的時候,同時對中間表的數據做相應更新。
技巧4:使用統計表。需要經常使用的統計數據,生成之後可以用專門的表來保存。
技巧5:分批保存歷史數據。歷史數據可以分段保存,比如2003年的歷史數據保存在 《2003表名》中,而2004年的歷史數據則保存在《2004表名》中。
技巧6:把不常用的數據從業務表中移到歷史表。比如職工檔案表,當某一職工離開公司以後,應該把他的職工檔案表中的信息移動到《離職職工檔案表》中。
1、經常查詢的和不常用的分開幾個表,也就是橫向切分
2、把不同類型的分成幾個表,縱向切分
3、常用聯接的建索引
4、伺服器放幾個硬碟,把數據、日誌、索引分盤存放,這樣可以提高IO吞吐率
5、用優化器,優化你的查詢
6、考慮冗餘,這樣可以減少連接
7、可以考慮建立統計表,就是實時生成總計表,這樣可以避免每次查詢都統計一次
8、用極量數據測試一下數據
速度,影響它的因數太多了,且數據量越大越明顯。
1、存儲將硬碟分成NTFS格式,NTFS比FAT32快,並看你的數據文件大小,1G以上你可以採用多資料庫文件,這樣可以將存取負載分散到多個物理硬碟或磁碟陣列上。
2、tempdbtempdb也應該被單獨的物理硬碟或磁碟陣列上,建議放在RAID0上,這樣它的性能最高,不要對它設置最大值讓它自動增長
3、日誌文件日誌文件也應該和數據文件分開在不同的理硬碟或磁碟陣列上,這樣也可以提高硬碟I/O性能。
4、分區視圖就是將你的數據水平分割在集群伺服器上,它適合大規模OLTP,SQL群集上,如果你資料庫不是訪問特別大不建議使用。
5、簇索引你的表一定有個簇索引,在使用簇索引查詢的時候,區塊查詢是最快的,如用between,應為他是物理連續的,你應該盡量減少對它的updaet,應為這可以使它物理不連續。
6、非簇索引非簇索引與物理順序無關,設計它時必須有高度的可選擇性,可以提高查詢速度,但對表update的時候這些非簇索引會影響速度,且佔用空間大,如果你願意用空間和修改時間換取速度可以考慮。
7、索引視圖如果在視圖上建立索引,那視圖的結果集就會被存儲起來,對與特定的查詢性能可以提高很多,但同樣對update語句時它也會嚴重減低性能,一般用在數據相對穩定的數據倉庫中。
8、維護索引你在將索引建好後,定期維護是很重要的,用dbccshowcontig來觀察頁密度、掃描密度等等,及時用dbccindexdefrag來整理表或視圖的索引,在必要的時候用dbccdbreindex來重建索引可以受到良好的效果。
不論你是用幾個表1、2、3點都可以提高一定的性能,5、6、8點你是必須做的,至於4、7點看你的需求,我個人是不建議的。
④ 大數據量高並發訪問資料庫結構的設計
大數據量高並發訪問資料庫結構的設計
如果不能設計一個合理的資料庫模型,不僅會增加客戶端和伺服器段程序的編程和維護的難度,而且將會影響系統實際運行的性能。所以,在一個系統開始實施之前,完備的資料庫模型的設計是必須的。
在一個系統分析、設計階段,因為數據量較小,負荷較低。我們往往只注意到功能的實現,而很難注意到性能的薄弱之處,等到系統投入實際運行一段時間後,才發現系統的性能在降低,這時再來考慮提高系統性能則要花費更多的人力物力,而整個系統也不可避免的形成了一個打補丁工程。
所以在考慮整個系統的流程的時候,我們必須要考慮,在高並發大數據量的訪問情況下,我們的系統會不會出現極端的情況。(例如:對外統計系統在7月16日出現的數據異常的情況,並發大數據量的的訪問造成,資料庫的響應時間不能跟上數據刷新的速度造成。具體情況是:在日期臨界時(00:00:00),判斷資料庫中是否有當前日期的記錄,沒有則插入一條當前日期的記錄。在低並發訪問的情況下,不會發生問題,但是當日期臨界時的訪問量相當大的時候,在做這一判斷的時候,會出現多次條件成立,則資料庫里會被插入多條當前日期的記錄,從而造成數據錯誤。),資料庫的模型確定下來之後,我們有必要做一個系統內數據流向圖,分析可能出現的瓶頸。
為了保證資料庫的一致性和完整性,在邏輯設計的時候往往會設計過多的表間關聯,盡可能的降低數據的冗餘。(例如用戶表的地區,我們可以把地區另外存放到一個地區表中)如果數據冗餘低,數據的完整性容易得到保證,提高了數據吞吐速度,保證了數據的完整性,清楚地表達數據元素之間的關系。而對於多表之間的關聯查詢(尤其是大數據表)時,其性能將會降低,同時也提高了客戶端程序的編程難度,因此,物理設計需折衷考慮,根據業務規則,確定對關聯表的數據量大小、數據項的訪問頻度,對此類數據表頻繁的關聯查詢應適當提高數據冗餘設計但增加了表間連接查詢的操作,也使得程序的變得復雜,為了提高系統的響應時間,合理的數據冗餘也是必要的。設計人員在設計階段應根據系統操作的類型、頻度加以均衡考慮。
另外,最好不要用自增屬性欄位作為主鍵與子表關聯。不便於系統的遷移和數據恢復。對外統計系統映射關系丟失(******************)。
原來的表格必須可以通過由它分離出去的表格重新構建。使用這個規定的好處是,你可以確保不會在分離的表格中引入多餘的列,所有你創建的表格結構都與它們的實際需要一樣大。應用這條規定是一個好習慣,不過除非你要處理一個非常大型的數據,否則你將不需要用到它。(例如一個通行證系統,我可以將USERID,USERNAME,USERPASSWORD,單獨出來作個表,再把USERID作為其他表的外鍵)
表的設計具體注意的問題:
1、數據行的長度不要超過8020位元組,如果超過這個長度的話在物理頁中這條數據會佔用兩行從而造成存儲碎片,降低查詢效率。
2、能夠用數字類型的欄位盡量選擇數字類型而不用字元串類型的(電話號碼),這會降低查詢和連接的性能,並會增加存儲開銷。這是因為引擎在處理查詢和連接回逐個比較字元串中每一個字元,而對於數字型而言只需要比較一次就夠了。
3、對於不可變字元類型char和可變字元類型varchar都是8000位元組,char查詢快,但是耗存儲空間,varchar查詢相對慢一些但是節省存儲空間。在設計欄位的時候可以靈活選擇,例如用戶名、密碼等長度變化不大的欄位可以選擇CHAR,對於評論等長度變化大的欄位可以選擇VARCHAR。
4、欄位的長度在最大限度的滿足可能的需要的前提下,應該盡可能的設得短一些,這樣可以提高查詢的效率,而且在建立索引的時候也可以減少資源的消耗。
5、基本表及其欄位之間的關系, 應盡量滿足第三範式。但是,滿足第三範式的資料庫設計,往往不是最好的設計。為了提高資料庫的運行效率,常常需要降低範式標准:適當增加冗餘,達到以空間換時間的目的。
6、若兩個實體之間存在多對多的關系,則應消除這種關系。消除的辦法是,在兩者之間增加第三個實體。這樣,原來一個多對多的關系,現在變為兩個一對多的關系。要將原來兩個實體的屬性合理地分配到三個實體中去。這里的第三個實體,實質上是一個較復雜的關系,它對應一張基本表。一般來講,資料庫設計工具不能識別多對多的關系,但能處理多對多的關系。
7、主鍵PK的取值方法,PK是供程序員使用的表間連接工具,可以是一無物理意義的數字串, 由程序自動加1來實現。也可以是有物理意義的欄位名或欄位名的組合。不過前者比後者好。當PK是欄位名的組合時,建議欄位的個數不要太多,多了不但索引佔用空間大,而且速度也慢。
8、主鍵與外鍵在多表中的重復出現, 不屬於數據冗餘,這個概念必須清楚,事實上有許多人還不清楚。非鍵欄位的重復出現, 才是數據冗餘!而且是一種低級冗餘,即重復性的冗餘。高級冗餘不是欄位的重復出現,而是欄位的派生出現。
〖例4〗:商品中的「單價、數量、金額」三個欄位,「金額」就是由「單價」乘以「數量」派生出來的,它就是冗餘,而且是一種高級冗餘。冗餘的目的是為了提高處理速度。只有低級冗餘才會增加數據的不一致性,因為同一數據,可能從不同時間、地點、角色上多次錄入。因此,我們提倡高級冗餘(派生性冗餘),反對低級冗餘(重復性冗餘)。
9、中間表是存放統計數據的表,它是為數據倉庫、輸出報表或查詢結果而設計的,有時它沒有主鍵與外鍵(數據倉庫除外)。臨時表是程序員個人設計的,存放臨時記錄,為個人所用。基表和中間表由DBA維護,臨時表由程序員自己用程序自動維護。
10、防止資料庫設計打補丁的方法是「三少原則」
(1) 一個資料庫中表的個數越少越好。只有表的個數少了,才能說明系統的E--R圖少而精,去掉了重復的多餘的實體,形成了對客觀世界的高度抽象,進行了系統的數據集成,防止了打補丁式的設計;
(2) 一個表中組合主鍵的欄位個數越少越好。因為主鍵的作用,一是建主鍵索引,二是做為子表的外鍵,所以組合主鍵的欄位個數少了,不僅節省了運行時間,而且節省了索引存儲空間;
(3) 一個表中的欄位個數越少越好。只有欄位的個數少了,才能說明在系統中不存在數據重復,且很少有數據冗餘,更重要的是督促讀者學會「列變行」,這樣就防止了將子表中的欄位拉入到主表中去,在主表中留下許多空餘的欄位。所謂「列變行」,就是將主表中的一部分內容拉出去,另外單獨建一個子表。這個方法很簡單,有的人就是不習慣、不採納、不執行。
資料庫設計的實用原則是:在數據冗餘和處理速度之間找到合適的平衡點。「三少」是一個整體概念,綜合觀點,不能孤立某一個原則。該原則是相對的,不是絕對的。「三多」原則肯定是錯誤的。試想:若覆蓋系統同樣的功能,一百個實體(共一千個屬性) 的E--R圖,肯定比二百個實體(共二千個屬性)的E--R圖,要好得多。
提倡「三少」原則,是叫讀者學會利用資料庫設計技術進行系統的數據集成。數據集成的步驟是將文件系統集成為應用資料庫,將應用資料庫集成為主題資料庫,將主題資料庫集成為全局綜合資料庫。集成的程度越高,數據共享性就越強,信息孤島現象就越少,整個企業信息系統的全局E—R圖中實體的個數、主鍵的個數、屬性的個數就會越少。
提倡「三少」原則的目的,是防止讀者利用打補丁技術,不斷地對資料庫進行增刪改,使企業資料庫變成了隨意設計資料庫表的「垃圾堆」,或資料庫表的「大雜院」,最後造成資料庫中的基本表、代碼表、中間表、臨時表雜亂無章,不計其數,導致企事業單位的信息系統無法維護而癱瘓。
「三多」原則任何人都可以做到,該原則是「打補丁方法」設計資料庫的歪理學說。「三少」原則是少而精的原則,它要求有較高的資料庫設計技巧與藝術,不是任何人都能做到的,因為該原則是杜絕用「打補丁方法」設計資料庫的理論依據。
11、在給定的系統硬體和系統軟體條件下,提高資料庫系統的運行效率的辦法是:
(1) 在資料庫物理設計時,降低範式,增加冗餘, 少用觸發器, 多用存儲過程。
(2) 當計算非常復雜、而且記錄條數非常巨大時(例如一千萬條),復雜計算要先在資料庫外面,以文件系統方式用編程語言計算處理完成之後,最後才入庫追加到表中去。
(3) 發現某個表的記錄太多,例如超過一千萬條,則要對該表進行水平分割。水平分割的做法是,以該表主鍵PK的某個值為界線,將該表的記錄水平分割為兩個表。若發現某個表的欄位太多,例如超過八十個,則垂直分割該表,將原來的一個表分解為兩個表。
(4) 對資料庫管理系統DBMS進行系統優化,即優化各種系統參數,如緩沖區個數。
(5) 在使用面向數據的SQL語言進行程序設計時,盡量採取優化演算法。
總之,要提高資料庫的運行效率,必須從資料庫系統級優化、資料庫設計級優化、程序實現級優化,這三個層次上同時下功夫。
主鍵設計:
1、不建議用多個欄位做主鍵,單個表還可以,但是關聯關系就會有問題,主鍵自增是高性能的。
2、一般情況下,如果有兩個外鍵,不建議採用兩個外鍵作為聯合住建,另建一個欄位作為主鍵。除非這條記錄沒有邏輯刪除標志,且該表永遠只有一條此聯合主鍵的記錄。
3、一般而言,一個實體不能既無主鍵又無外鍵。在E—R 圖中, 處於葉子部位的實體, 可以定義主鍵,也可以不定義主鍵(因為它無子孫), 但必須要有外鍵(因為它有父親)。
主鍵與外鍵的設計,在全局資料庫的設計中,佔有重要地位。當全局資料庫的設計完成以後,有個美國資料庫設計專家說:「鍵,到處都是鍵,除了鍵之外,什麼也沒有」,這就是他的資料庫設計經驗之談,也反映了他對信息系統核心(數據模型)的高度抽象思想。因為:主鍵是實體的高度抽象,主鍵與、外鍵的配對,表示實體之間的連接。