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

熱線電話:13121318867

登錄
首頁精彩閱讀你真的會玩SQL嗎?三范式、數(shù)據(jù)完整性
你真的會玩SQL嗎?三范式、數(shù)據(jù)完整性
2017-07-06
收藏

你真的會玩SQL嗎?三范式、數(shù)據(jù)完整性

每次上新功能時都需要添加新表,這時就要涉及到表結構的設計,那就要提到三范式,對于三范式教科書上說得很繞口,那簡單點的呢?

三范式

第一范式:屬性不可分,不允許存在隱藏字段,屬性保持“原子性”

第二范式:要有主鍵。為實現(xiàn)區(qū)分通常需要為表加上一個列,以存儲各個實例的唯一標識。

第三范式:要求一個數(shù)據(jù)庫表中不包含已在其它表中已包含的非主關鍵字信息。


正規(guī)化范式(BCDF):所有表中的決定因素必須是一個候選鍵,如果只有一個候選鍵,那么就和第三范式是一樣的。

第四范式(4NF):消除多值依賴。

第五范式(5NF):消除循環(huán)依賴。

我們設計表結構往往都尊從簡單的三范式,從其他元素中消除數(shù)據(jù)冗余問題, 從特定的表中最小化冗余意味著擺脫不必要的數(shù)據(jù)。

先看看目的,消除數(shù)據(jù)冗余的影響如下:

?物理空間需要存儲的數(shù)據(jù)減少。

?數(shù)據(jù)變得更有組織。

?范式化允許修改少量的數(shù)據(jù)(即單記錄)。換言之,一個表的具體字段記錄更新時,會影響其他引用他的表。

但是,設計表遵從范式越高則存在“過度設計“的問題,會增加多表間的查詢開銷,我們只能適度的設計,適度的反范式。如上圖中3范式,若就想把樓棟一起查詢出來,那從設計上可以分開,另用一個視圖將樓棟名稱一起查詢出來即可。


數(shù)據(jù)完整性

數(shù)據(jù)庫中的數(shù)據(jù)是從外界輸入的,而數(shù)據(jù)的輸入由于種種原因,會發(fā)生輸入無效或錯誤信息。保證輸入的數(shù)據(jù)符合規(guī)定,成為了數(shù)據(jù)庫系統(tǒng),尤其是多用戶的關系數(shù)據(jù)庫系統(tǒng)首要關注的問題。數(shù)據(jù)完整性因此而提出。


數(shù)據(jù)完整性保證了在數(shù)據(jù)庫中存儲數(shù)據(jù)的一致性和正確性。

實體完整性:保證每一行都能被由稱為主鍵的屬性來標識

域完整性:保證在效范圍內的值才能存儲到相應列中

引用完整性:確保外鍵的值必須與相關的主鍵相匹配,禁止在從表中插入包含主表中不存在的關鍵字的數(shù)據(jù)行;

用戶定義完整性:由用戶指定的一組規(guī)則


實現(xiàn)數(shù)據(jù)完整性的主要方式是約束

主鍵約束 primary key 確保字段值不重復不為NULL

唯一約束 unique 確保字段值不重復

外鍵約束 foreign key 確保字段值必須來自于指定表

檢查約束 check 確保字段值的取值范圍

缺省約束 default  給相應字段提供默認值

注:約束即可在創(chuàng)表時創(chuàng)建,也可在已存在的表上添加

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

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

數(shù)據(jù)分析師考試動態(tài)
數(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(); // 調用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調,回調的第一個參數(shù)驗證碼對象,之后可以使用它調用相應的接口 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); }