很多時(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;}新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注