国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

數(shù)據(jù)庫(kù)優(yōu)化設(shè)計(jì)

2019-11-15 01:29:13
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
數(shù)據(jù)庫(kù)優(yōu)化設(shè)計(jì)

  很多時(shí)候,我們?cè)陧?xiàng)目中,可能會(huì)隨著需求的不斷更改,我們需要在原有的庫(kù)表結(jié)構(gòu)中增加字段,從而滿足我們的業(yè)務(wù)需求。

  舉一個(gè)簡(jiǎn)單的例子:

    我需要一張數(shù)據(jù)庫(kù)表,用來(lái)存儲(chǔ)某個(gè)網(wǎng)站的用戶信息。該用戶信息需要包括(帳號(hào)是否是活躍帳號(hào)、帳號(hào)是否綁定郵箱、帳號(hào)是否購(gòu)買過(guò)產(chǎn)品、帳號(hào)是否過(guò)期....等等),一般情況下,我們可能會(huì)這么設(shè)計(jì)這張庫(kù)表:

  

CREATE TABLE 'ACCOUNT' (      `ID` int(22)  NOT NULL AUTO_INCREMENT, --自增id      `F001` TINYINT(1) NOT NULL, --是否活躍(1:是/0:否)      `F002` TINYINT(1) NOT NULL, --是否綁定 (1:是/0:否)      `F003`  TINYINT(1) NOT NULL, --是否購(gòu)買產(chǎn)品 (1:是/0:否)      `F004`  TINYINT(1) NOT NULL, --是否過(guò)期 (1:是/0:否)      PRIMARY KEY('ID')                  ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

  如果按照以上方法進(jìn)行設(shè)計(jì),那么當(dāng)需求變更,如:增加一個(gè)字段,帳號(hào)是否有效。那么我們就需要再增加一個(gè)字段`F005`,這樣會(huì)導(dǎo)致管理起來(lái)非常麻煩,當(dāng)新增字段時(shí),需要去更新所有或者歷史數(shù)據(jù),很容易導(dǎo)致數(shù)據(jù)丟失。

  那么,怎么去解決這個(gè)問(wèn)題,讓數(shù)據(jù)字段間的關(guān)聯(lián)影響盡可能的降低。現(xiàn)在有一種辦法就是,將這些字段整合全部放到一個(gè)字段中。如:`FLAG`字段 按10進(jìn)制進(jìn)行存儲(chǔ)(第一位:1:活躍,0:非活躍。第二位:1:綁定,2:未綁定。第三位:1:購(gòu)買過(guò)產(chǎn)品,0:未購(gòu)買....),解釋一下:如果這個(gè)字段的值是5,轉(zhuǎn)換成二進(jìn)制是 101,第一位是1,第二位0,第三位1.那么就表示該帳號(hào)是“活躍、未綁定、且購(gòu)買過(guò)產(chǎn)品”。這種方式有什么好處呢,好處在于各個(gè)類型之間的關(guān)聯(lián)關(guān)系很小,不會(huì)因?yàn)楦乱粋€(gè)字段類型而影響了其他字段。那么,這樣設(shè)計(jì),該如何查詢呢? 按位與,具體情況可以舉一個(gè)例子,當(dāng)我需要查詢所有購(gòu)買過(guò)產(chǎn)品,而且活躍的帳號(hào),也即(第一位和第三位為1),其他位我們填0,即101=5:

  sql語(yǔ)句查詢:

    

SELECT * FROM ACCOUNT WHERE F005&5>0;

  以上sql語(yǔ)句就能查詢出購(gòu)買過(guò)產(chǎn)品而且活躍的帳號(hào)。

  那么,更新修改的時(shí)候只需要在后臺(tái)程序中將各二進(jìn)制位更新為需求的值就好了,例如,剛才的購(gòu)買過(guò)且活躍,即101,要更改為購(gòu)買過(guò),但不是活躍的話,那么就用 (5&1)=1,從而實(shí)現(xiàn)將第三位置0。這里提供一個(gè)php函數(shù)可以很好的處理該程序業(yè)務(wù)。

  

<?php/** * 取按位與要寫入的數(shù)據(jù) * @param  $param 原值 * @param  $postData  提交的數(shù)據(jù)key=>value,key必須從1開(kāi)始的數(shù)據(jù),value必須為0或者(key-1)次方數(shù) key代表位 */function getExtValue($param = 0,$postData = array()){    if(!empty$postData){        foreach($postData as $key=>$value){            $tmp1 = pow(2,($key-1));            if (empty($key) || !is_numeric($key) || !is_numeric($value) || ($value != 0 && $value !=$tmp1)){                continue;            }            $param = ($param & (0xffff^$tmp1)) | $value;        }    }    return $param;}


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宁海县| 简阳市| 高碑店市| 田林县| 新丰县| 常德市| 哈密市| 佛冈县| 达州市| 辉县市| 丹阳市| 施秉县| 伊金霍洛旗| 简阳市| 昆明市| 张家川| 呼图壁县| 祁门县| 忻州市| 赤壁市| 梨树县| 宜都市| 馆陶县| 抚顺县| 常德市| 彰化县| 六安市| 浦北县| 彭水| 涿州市| 尼木县| 锡林浩特市| 荔波县| 咸丰县| 彝良县| 敖汉旗| 神木县| 阜城县| 万盛区| 绥宁县| 澎湖县|