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

熱線電話:13121318867

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

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

每次上新功能時(shí)都需要添加新表,這時(shí)就要涉及到表結(jié)構(gòu)的設(shè)計(jì),那就要提到三范式,對(duì)于三范式教科書(shū)上說(shuō)得很繞口,那簡(jiǎn)單點(diǎn)的呢?

三范式

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

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

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


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

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

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

我們?cè)O(shè)計(jì)表結(jié)構(gòu)往往都尊從簡(jiǎn)單的三范式,從其他元素中消除數(shù)據(jù)冗余問(wèn)題, 從特定的表中最小化冗余意味著擺脫不必要的數(shù)據(jù)。

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

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

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

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

但是,設(shè)計(jì)表遵從范式越高則存在“過(guò)度設(shè)計(jì)“的問(wèn)題,會(huì)增加多表間的查詢(xún)開(kāi)銷(xiāo),我們只能適度的設(shè)計(jì),適度的反范式。如上圖中3范式,若就想把樓棟一起查詢(xún)出來(lái),那從設(shè)計(jì)上可以分開(kāi),另用一個(gè)視圖將樓棟名稱(chēng)一起查詢(xún)出來(lái)即可。


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

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


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

實(shí)體完整性:保證每一行都能被由稱(chēng)為主鍵的屬性來(lái)標(biāo)識(shí)

域完整性:保證在效范圍內(nèi)的值才能存儲(chǔ)到相應(yīng)列中

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

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


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

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

唯一約束 unique 確保字段值不重復(fù)

外鍵約束 foreign key 確保字段值必須來(lái)自于指定表

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

缺省約束 default  給相應(yīng)字段提供默認(rèn)值

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

數(shù)據(jù)分析咨詢(xún)請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

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

OK
客服在線
立即咨詢(xún)
客服在線
立即咨詢(xún)
') } 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(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶(hù)后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見(jiàn):http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".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 = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+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); }