很多時候,我們在項目中,可能會隨著需求的不斷更改,我們需要在原有的庫表結構中增加字段,從而滿足我們的業務需求。
舉一個簡單的例子:
我需要一張數據庫表,用來存儲某個網站的用戶信息。該用戶信息需要包括(帳號是否是活躍帳號、帳號是否綁定郵箱、帳號是否購買過產品、帳號是否過期....等等),一般情況下,我們可能會這麼設計這張庫表:
() 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函數可以很好的處理該程序業務。
<? getExtValue( = 0, = (!( => = (2,(-1 (() || !() || !() || ( != 0 && != = ( & (0xffff^)) |