■文/宋凌宇 張樹勇 闞景森
淺談媒體協同數據庫設計
■文/宋凌宇 張樹勇 闞景森
數據庫是信息系統的核心和基礎,一個好的數據庫設計在實現信息系統方便、及時、準確地獲得所需的信息之外,還要滿足易維護、易擴充等要求,并考慮到數據的一致性、冗余性、訪問效率等。
數據庫;表;檢索;索引
2015年3月起,隨著國家數字復合出版系統工程——媒體協同(即07包)系統的設計和研發逐步展開,數據庫的設計變得尤為關鍵。通過對以往一些應用系統開發過程出現的問題進行分析,然后規避這些問題,設計出一個規范、高性能、易維護、易擴展的數據庫,以實現07包的功能需求及后期的擴展。
筆者參與過一些應用系統的設計和研發工作,經歷過項目研發過程中的瓶頸和問題,這些問題表現在以下幾個方面。
有些項目的數據表和字段命名不規范,往往難以找到所需要的庫表,給開發人員帶來很多不便,甚至困惑。
有些項目的數據表字段數量剛好符合開始設計時的功能需求,那么在開發過程中有功能擴充時,就要增加數據表字段、數據表,有可能會造成程序的修改,甚至重新開發,這樣就會加大開發人員工作量,也有可能造成項目的延期;再者項目交付多個用戶后,會造成項目多版本維護,增加維護的難度。
有些項目在設計之初,考慮得相當完善,規避了許多數據庫設計時的問題。但隨著用戶使用數據的增漲,尤其達到百萬級以上,數據的檢索速度明顯變慢,勢必給用戶帶來不便,甚至厭煩。
如:部分用戶應用系統情況

用戶 稿件表記錄 日志表記錄 檢索耗時半島都市報 30多萬條 180多萬條 5分鐘大眾日報 40多萬條 200多萬條 5分鐘…
數據庫的設計是07包的各功能能否緊密地結合在一起以及如何結合的關鍵所在,是07包開發和建設的重要組成部分。從以下幾個方面對數據庫的設計進行規范和優化設計。
表:T+代表字母+表名 。數據表名由具有能描述表內容等特殊含義的單詞或縮寫組成。如:TISTORYSOURCE稿件來源表。
字段:類型前綴+字段名。必須以有特征含義的單詞或縮寫組成。
主鍵:PK_。主鍵名稱應是 前綴+表名+構成的字段名。如果復合主鍵的構成字段較多,則只包含第一個字段。表名可以去掉前綴。
外鍵:FK_。外鍵名稱應是 前綴+外鍵表名+主鍵表名+外鍵表構成的字段名。表名可以去掉前綴。
索引:IDX_。索引名稱應是 前綴+表名+構成的字段名。如果復合索引的構成字段較多,則只包含第一個字段,并添加序號。表名可以去掉前綴。
根據07包功能數據的邏輯進行分塊設計。
TI_(TableInfo_縮寫)。 是跟系統中參數設置相關的數據表,如:稿件體裁、來源、分類等。
TB_(TableBase_縮寫)。 是跟系統中基礎信息設置相關的數據表, 如:部門、人員、作者、角色、共享范圍等。
TW_(TableWork _縮寫)是跟07包實際業務相關的數據表,如:稿件、報題、任務、選題等。
TR_(TableRole_縮寫)。是跟角色權限相關的數據表。
應07包業務要求,有很多關聯查詢需求,在設計之初就有必要正確處理多對多的關系。盡量消除多對多情況,將一個多對多的關系,變為兩個一對多的關系。
如圖1:一個人員有可能有多個角色,反之一個角色賦值多個人員。在角色和人員表中增加一個角色人員表,就變為兩個一對多的關系了。

圖1
再有,因用戶個性需求而易改變的關鍵數據,增加“名值表”設計。“名值表”,顧名思義就是,那些鍵被其他數據關聯著的值修改時,不會造成數據存放的混亂,便于多表關聯查詢。
第三,為實現數據的完整性,在設計數據表時就考慮了數據冗余,以及事務的添加、級聯刪除和級聯更新等。
07包數據庫的設計不但滿足當前的功能需求,還要考慮未來功能的擴展,增加07包的靈活性。
預留數據表。在設計時考慮未來可能的業務,預設計一些數據表。如:音視頻信息擴展表,擬記錄音視頻的碼率、時長等信息。
預留字段。在設計時針對系統業務數據表,基本都預留1-2個字段,便于功能的擴展和后續的業務拓展。如果這些預留字段不能滿足未來業務的需求,那么就通過添加數據表,實現更高的可擴充性要求。
對于大的數據庫表,合理的索引能夠提高整個數據庫的操作效率。索引在數據庫優化中占有一個非常大的比例,在設計數據表時,充分考慮到當單表數據量很大時,比如說是百萬數量級,如果我們使用普通的查詢語句,耗時會非常多。給這些表建上好的索引,能將檢索效率提高幾十甚至幾百倍。
在設計索引時,遵循以下規則:
①主鍵(sguid)的數據列、有外鍵的數據列(fk_sguid)一定要建立索引。
②對于經常查詢的數據列根據需要建立索引。
③對于需要在指定范圍內快速或頻繁查詢的數據列,如“**name LIKE ‘a%’”,最好建立索引。
④經常用在WHERE子句中的數據列,建立索引。
⑤經常出現在關鍵字order by、group by、distinct后面的字段,建立索引。如果建立的是復合索引,索引的字段順序要和這些關鍵字后面的字段順序一致,否則索引不會被使用。
⑥對于那些查詢中很少涉及的列,重復值比較多的列不要建立索引。
⑦對于定義為text、image、blob和bit數據類型的列不要建立索引。
⑧對于經常存取的列避免建立索引 。
⑨限制表上的索引數目。對一個存在大量更新操作的表,所建索引的數目一般不要超過3個,最多不要超過5個。索引雖說提高了訪問速度,但太多索引會影響數據的更新操作。
⑩對復合索引,按照字段在查詢條件中出現的頻度建立索引。在復合索引中,記錄首先按照第一個字段排序。對于在第一個字段上取值相同的記錄,系統再按照第二個字段的取值排序,以此類推。只有復合索引的第一個字段出現在查詢條件中,該索引才可能被使用,因此將應用頻度高的字段,放置在復合索引的前面,會使系統最大可能地使用此索引,發揮索引的作用。
?在Join查詢時,兩個表中Join的字段建立索引。
遵循以上規則對07包中稿件表和日志表、操作歷史表等關鍵列增加索引設置。
附:用戶數據庫優化后應用系統檢索情況,如下表:

用戶稿件表記錄日志表記錄索引前檢索耗時索引后檢索耗時 備注半島都市報 30多萬條 180多萬條 5分鐘 1-3秒大眾日本 40多萬條 200多萬條 5分鐘 1-3秒 服務器性能好…
本文通過論述一些應用系統的現存問題,得出數據庫設計的重要性。提出07包的數據庫設計時要遵循的原則和規范,從而設計出一個滿足07包功能需求和未來擴展的高性能、易維護、易擴展的數據庫。
[1]勵文杰.大型數據庫ORACLE數據庫的優化設計方案[J].科技風,2011(19).
[2]趙靜宇.數據庫設計規范化的理論研究與應用[J].電子技術與軟件工程,2013(21).
[3]汪輝.基于大數據應用系統架構的設計與實現[J].電子技術與軟件工程,2015(20).
(作者單位:濰坊北大青鳥華光照排有限公司;東營日報社)
G202
A
1671-0134(2017)08-081-02
10.19483/j.cnki.11-4653/n.2017.08.029
本文受國家數字復合出版系統工程-媒體協同工作系統(1141STC40519/07)項目資助。