很多時候,我們在項目中,可能會隨著需求的不斷更改,我們需要在原有的庫表結構中增加欄位,從而滿足我們的業務需求。
舉一個簡單的例子:
我需要一張資料庫表,用來儲存某個網站的使用者資訊。該使用者資訊需要包括(帳號是否是活躍帳號、帳號是否綁定郵箱、帳號是否購買過產品、帳號是否到期....等等),一般情況下,我們可能會這麼設計這張庫表:
() AUTO_INCREMENT, `F001` () , `F002` () , `F003` () , `F004` () , (InnoDB AUTO_INCREMENT CHARSETutf8;
如果按照以上方法進行設計,那麼當需求變更,如:增加一個欄位,帳號是否有效。那麼我們就需要再增加一個欄位`F005`,這樣會導致管理起來非常麻煩,當新增欄位時,需要去更新所有或者曆史資料,很容易導致資料丟失。
那麼,怎麼去解決這個問題,讓資料欄位間的關聯影響儘可能的降低。現在有一種辦法就是,將這些欄位整合全部放到一個欄位中。如:`FLAG`欄位 按10進位進行儲存(第一位:1:活躍,0:非活躍。第二位:1:綁定,2:未綁定。第三位:1:購買過產品,0:未購買....),解釋一下:如果這個欄位的值是5,轉換成二進位是 101,第一位是1,第二位0,第三位1.那麼就表示該帳號是“活躍、未綁定、且購買過產品”。這種方式有什麼好處呢,好處在於各個類型之間的關聯關係很小,不會因為更新一個欄位類型而影響了其他欄位。那麼,這樣設計,該如何查詢呢? 按位與,具體情況可以舉一個例子,當我需要查詢所有購買過產品,而且活躍的帳號,也即(第一位和第三位為1),其他位我們填0,即101=5:
sql語句查詢:
ACCOUNT F005;
以上sql語句就能查詢出購買過產品而且活躍的帳號。
那麼,更新修改的時候只需要在背景程式中將各二進位位更新為需求的值就好了,例如,剛才的購買過且活躍,即101,要更改為購買過,但不是活躍的話,那麼就用 (5&1)=1,從而實現將第三位置0。這裡提供一個PHP函數可以很好的處理該程式業務。
value,key必須從1開始的資料,value必須為0或者(key-1)次方數 key代表位 getExtValue( = 0, = (!( => = (2,(-1 (() || !() || !() || ( != 0 && != = ( & (0xffff^)) |
http://www.bkjia.com/PHPjc/743382.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/743382.htmlTechArticle很多時候,我們在項目中,可能會隨著需求的不斷更改,我們需要在原有的庫表結構中增加欄位,從而滿足我們的業務需求。 舉一個簡單的...