99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀大數(shù)據(jù)量高并發(fā)訪問數(shù)據(jù)庫結(jié)構(gòu)的設計
大數(shù)據(jù)量高并發(fā)訪問數(shù)據(jù)庫結(jié)構(gòu)的設計
2017-12-28
收藏

大數(shù)據(jù)量高并發(fā)訪問數(shù)據(jù)庫結(jié)構(gòu)的設計

如果不能設計一個合理的數(shù)據(jù)庫模型,不僅會增加客戶端和服務器段程序的編程和維護的難度,而且將會影響系統(tǒng)實際運行的性能。所以,在一個系統(tǒng)開始實施之前,完備的數(shù)據(jù)庫模型的設計是必須的。

    在一個系統(tǒng)分析、設計階段,因為數(shù)據(jù)量較小,負荷較低。我們往往只注意到功能的實現(xiàn),而很難注意到性能的薄弱之處,等到系統(tǒng)投入實際運行一段時間后,才發(fā)現(xiàn)系統(tǒng)的性能在降低,這時再來考慮提高系統(tǒng)性能則要花費更多的人力物力,而整個系統(tǒng)也不可避免的形成了一個打補丁工程。
    所以在考慮整個系統(tǒng)的流程的時候,我們必須要考慮,在高并發(fā)大數(shù)據(jù)量的訪問情況下,我們的系統(tǒng)會不會出現(xiàn)極端的情況。(例如:對外統(tǒng)計系統(tǒng)在7月16日出現(xiàn)的數(shù)據(jù)異常的情況,并發(fā)大數(shù)據(jù)量的的訪問造成,數(shù)據(jù)庫的響應時間不能跟上數(shù)據(jù)刷新的速度造成。具體情況是:在日期臨界時(00:00:00),判斷數(shù)據(jù)庫中是否有當前日期的記錄,沒有則插入一條當前日期的記錄。在低并發(fā)訪問的情況下,不會發(fā)生問題,但是當日期臨界時的訪問量相當大的時候,在做這一判斷的時候,會出現(xiàn)多次條件成立,則數(shù)據(jù)庫里會被插入多條當前日期的記錄,從而造成數(shù)據(jù)錯誤。),數(shù)據(jù)庫的模型確定下來之后,我們有必要做一個系統(tǒng)內(nèi)數(shù)據(jù)流向圖,分析可能出現(xiàn)的瓶頸。
    為了保證數(shù)據(jù)庫的一致性和完整性,在邏輯設計的時候往往會設計過多的表間關聯(lián),盡可能的降低數(shù)據(jù)的冗余。(例如用戶表的地區(qū),我們可以把地區(qū)另外存放到一個地區(qū)表中)如果數(shù)據(jù)冗余低,數(shù)據(jù)的完整性容易得到保證,提高了數(shù)據(jù)吞吐速度,保證了數(shù)據(jù)的完整性,清楚地表達數(shù)據(jù)元素之間的關系。而對于多表之間的關聯(lián)查詢(尤其是大數(shù)據(jù)表)時,其性能將會降低,同時也提高了客戶端程序的編程難度,因此,物理設計需折衷考慮,根據(jù)業(yè)務規(guī)則,確定對關聯(lián)表的數(shù)據(jù)量大小、數(shù)據(jù)項的訪問頻度,對此類數(shù)據(jù)表頻繁的關聯(lián)查詢應適當提高數(shù)據(jù)冗余設計但增加了表間連接查詢的操作,也使得程序的變得復雜,為了提高系統(tǒng)的響應時間,合理的數(shù)據(jù)冗余也是必要的。設計人員在設計階段應根據(jù)系統(tǒng)操作的類型、頻度加以均衡考慮。
   另外,最好不要用自增屬性字段作為主鍵與子表關聯(lián)。不便于系統(tǒng)的遷移和數(shù)據(jù)恢復。對外統(tǒng)計系統(tǒng)映射關系丟失(******************)。
    原來的表格必須可以通過由它分離出去的表格重新構(gòu)建。使用這個規(guī)定的好處是,你可以確保不會在分離的表格中引入多余的列,所有你創(chuàng)建的表格結(jié)構(gòu)都與它們的實際需要一樣大。應用這條規(guī)定是一個好習慣,不過除非你要處理一個非常大型的數(shù)據(jù),否則你將不需要用到它。(例如一個通行證系統(tǒng),我可以將USERID,USERNAME,USERPASSWORD,單獨出來作個表,再把USERID作為其他表的外鍵)
表的設計具體注意的問題:
1、數(shù)據(jù)行的長度不要超過8020字節(jié),如果超過這個長度的話在物理頁中這條數(shù)據(jù)會占用兩行從而造成存儲碎片,降低查詢效率。
2、能夠用數(shù)字類型的字段盡量選擇數(shù)字類型而不用字符串類型的(電話號碼),這會降低查詢和連接的性能,并會增加存儲開銷。這是因為引擎在處理查詢和連接回逐個比較字符串中每一個字符,而對于數(shù)字型而言只需要比較一次就夠了。
3、對于不可變字符類型char和可變字符類型varchar 都是8000字節(jié),char查詢快,但是耗存儲空間,varchar查詢相對慢一些但是節(jié)省存儲空間。在設計字段的時候可以靈活選擇,例如用戶名、密碼等長度變化不大的字段可以選擇CHAR,對于評論等長度變化大的字段可以選擇VARCHAR。

4、字段的長度在最大限度的滿足可能的需要的前提下,應該盡可能的設得短一些,這樣可以提高查詢的效率,而且在建立索引的時候也可以減少資源的消耗。

5、基本表及其字段之間的關系, 應盡量滿足第三范式。但是,滿足第三范式的數(shù)據(jù)庫設計,往往不是最好的設計。為了提高數(shù)據(jù)庫的運行效率,常常需要降低范式標準:適當增加冗余,達到以空間換時間的目的。

6、若兩個實體之間存在多對多的關系,則應消除這種關系。消除的辦法是,在兩者之間增加第三個實體。這樣,原來一個多對多的關系,現(xiàn)在變?yōu)閮蓚€一對多的關系。要將原來兩個實體的屬性合理地分配到三個實體中去。這里的第三個實體,實質(zhì)上是一個較復雜的關系,它對應一張基本表。一般來講,數(shù)據(jù)庫設計工具不能識別多對多的關系,但能處理多對多的關系。

7、主鍵PK的取值方法,PK是供程序員使用的表間連接工具,可以是一無物理意義的數(shù)字串, 由程序自動加1來實現(xiàn)。也可以是有物理意義的字段名或字段名的組合。不過前者比后者好。當PK是字段名的組合時,建議字段的個數(shù)不要太多,多了不但索引占用空間大,而且速度也慢。

8、主鍵與外鍵在多表中的重復出現(xiàn), 不屬于數(shù)據(jù)冗余,這個概念必須清楚,事實上有許多人還不清楚。非鍵字段的重復出現(xiàn), 才是數(shù)據(jù)冗余!而且是一種低級冗余,即重復性的冗余。高級冗余不是字段的重復出現(xiàn),而是字段的派生出現(xiàn)。

  〖例4〗:商品中的“單價、數(shù)量、金額”三個字段,“金額”就是由“單價”乘以“數(shù)量”派生出來的,它就是冗余,而且是一種高級冗余。冗余的目的是為了提高處理速度。只有低級冗余才會增加數(shù)據(jù)的不一致性,因為同一數(shù)據(jù),可能從不同時間、地點、角色上多次錄入。因此,我們提倡高級冗余(派生性冗余),反對低級冗余(重復性冗余)。

9、中間表是存放統(tǒng)計數(shù)據(jù)的表,它是為數(shù)據(jù)倉庫、輸出報表或查詢結(jié)果而設計的,有時它沒有主鍵與外鍵(數(shù)據(jù)倉庫除外)。臨時表是程序員個人設計的,存放臨時記錄,為個人所用?;砗椭虚g表由DBA維護,臨時表由程序員自己用程序自動維護。

10、防止數(shù)據(jù)庫設計打補丁的方法是“三少原則”

   (1) 一個數(shù)據(jù)庫中表的個數(shù)越少越好。只有表的個數(shù)少了,才能說明系統(tǒng)的E--R圖少而精,去掉了重復的多余的實體,形成了對客觀世界的高度抽象,進行了系統(tǒng)的數(shù)據(jù)集成,防止了打補丁式的設計;

   (2) 一個表中組合主鍵的字段個數(shù)越少越好。因為主鍵的作用,一是建主鍵索引,二是做為子表的外鍵,所以組合主鍵的字段個數(shù)少了,不僅節(jié)省了運行時間,而且節(jié)省了索引存儲空間;

   (3) 一個表中的字段個數(shù)越少越好。只有字段的個數(shù)少了,才能說明在系統(tǒng)中不存在數(shù)據(jù)重復,且很少有數(shù)據(jù)冗余,更重要的是督促讀者學會“列變行”,這樣就防止了將子表中的字段拉入到主表中去,在主表中留下許多空余的字段。所謂“列變行”,就是將主表中的一部分內(nèi)容拉出去,另外單獨建一個子表。這個方法很簡單,有的人就是不習慣、不采納、不執(zhí)行。

  數(shù)據(jù)庫設計的實用原則是:在數(shù)據(jù)冗余和處理速度之間找到合適的平衡點。“三少”是一個整體概念,綜合觀點,不能孤立某一個原則。該原則是相對的,不是絕對的。“三多”原則肯定是錯誤的。試想:若覆蓋系統(tǒng)同樣的功能,一百個實體(共一千個屬性) 的E--R圖,肯定比二百個實體(共二千個屬性)的E--R圖,要好得多。

  提倡“三少”原則,是叫讀者學會利用數(shù)據(jù)庫設計技術進行系統(tǒng)的數(shù)據(jù)集成。數(shù)據(jù)集成的步驟是將文件系統(tǒng)集成為應用數(shù)據(jù)庫,將應用數(shù)據(jù)庫集成為主題數(shù)據(jù)庫,將主題數(shù)據(jù)庫集成為全局綜合數(shù)據(jù)庫。集成的程度越高,數(shù)據(jù)共享性就越強,信息孤島現(xiàn)象就越少,整個企業(yè)信息系統(tǒng)的全局E—R圖中實體的個數(shù)、主鍵的個數(shù)、屬性的個數(shù)就會越少。

  提倡“三少”原則的目的,是防止讀者利用打補丁技術,不斷地對數(shù)據(jù)庫進行增刪改,使企業(yè)數(shù)據(jù)庫變成了隨意設計數(shù)據(jù)庫表的“垃圾堆”,或數(shù)據(jù)庫表的“大雜院”,最后造成數(shù)據(jù)庫中的基本表、代碼表、中間表、臨時表雜亂無章,不計其數(shù),導致企事業(yè)單位的信息系統(tǒng)無法維護而癱瘓。

   “三多”原則任何人都可以做到,該原則是“打補丁方法”設計數(shù)據(jù)庫的歪理學說?!叭佟痹瓌t是少而精的原則,它要求有較高的數(shù)據(jù)庫設計技巧與藝術,不是任何人都能做到的,因為該原則是杜絕用“打補丁方法”設計數(shù)據(jù)庫的理論依據(jù)。


11、在給定的系統(tǒng)硬件和系統(tǒng)軟件條件下,提高數(shù)據(jù)庫系統(tǒng)的運行效率的辦法是:

   (1) 在數(shù)據(jù)庫物理設計時,降低范式,增加冗余, 少用觸發(fā)器, 多用存儲過程。
   (2) 當計算非常復雜、而且記錄條數(shù)非常巨大時(例如一千萬條),復雜計算要先在數(shù)據(jù)庫外面,以文件系統(tǒng)方式用編程語言計算處理完成之后,最后才入庫追加到表中去。

   (3) 發(fā)現(xiàn)某個表的記錄太多,例如超過一千萬條,則要對該表進行水平分割。水平分割的做法是,以該表主鍵PK的某個值為界線,將該表的記錄水平分割為兩個表。若發(fā)現(xiàn)某個表的字段太多,例如超過八十個,則垂直分割該表,將原來的一個表分解為兩個表。

   (4) 對數(shù)據(jù)庫管理系統(tǒng)DBMS進行系統(tǒng)優(yōu)化,即優(yōu)化各種系統(tǒng)參數(shù),如緩沖區(qū)個數(shù)。
   (5) 在使用面向數(shù)據(jù)的SQL語言進行程序設計時,盡量采取優(yōu)化算法。
  總之,要提高數(shù)據(jù)庫的運行效率,必須從數(shù)據(jù)庫系統(tǒng)級優(yōu)化、數(shù)據(jù)庫設計級優(yōu)化、程序?qū)崿F(xiàn)級優(yōu)化,這三個層次上同時下功夫。

主鍵設計:
1、不建議用多個字段做主鍵,單個表還可以,但是關聯(lián)關系就會有問題,主鍵自增是高性能的。

2、一般情況下,如果有兩個外鍵,不建議采用兩個外鍵作為聯(lián)合住建,另建一個字段作為主鍵。除非這條記錄沒有邏輯刪除標志,且該表永遠只有一條此聯(lián)合主鍵的記錄。

3、一般而言,一個實體不能既無主鍵又無外鍵。在E—R 圖中, 處于葉子部位的實體, 可以定義主鍵,也可以不定義主鍵(因為它無子孫), 但必須要有外鍵(因為它有父親)。
主鍵與外鍵的設計,在全局數(shù)據(jù)庫的設計中,占有重要地位。當全局數(shù)據(jù)庫的設計完成以后,有個美國數(shù)據(jù)庫設計專家說:“鍵,到處都是鍵,除了鍵之外,什么也沒有”,這就是他的數(shù)據(jù)庫設計經(jīng)驗之談,也反映了他對信息系統(tǒng)核心(數(shù)據(jù)模型)的高度抽象思想。因為:主鍵是實體的高度抽象,主鍵與、外鍵的配對,表示實體之間的連接。


數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }