曾經在qq的日誌裏寫過關於二進制在小型權限系統處理中的作用,這裏就又從新整理了一下。
編程中很多時候我們會遇到一種情況,一個對象有多種屬性(就好比一個電影內容可以有愛情,動作,懸疑,科幻等)。總結了一下這個時候的幾種情況: 1. 如果這個對象只能選擇這多種屬性中的一種。 當客戶有種要求的時候,那麼就很好處理的,只需定義一個字段以一個數字形式保存在數據庫中即可。這個沒什麼好思考的。 2. 如果這個對象可以同時具有多種屬性。 當對象有多個屬性同時存在的時候,就我從網上看來的又可以分兩種處理方法: 第一種前後臺經常需要根據屬性搜索數據庫(像搜索電影類型),這時候一般的可能就會在數據庫中定義多個類型是布爾的字段,這種做法是相當簡單的了,缺點就是當屬性較多時,數據庫維護很麻煩,但好處是在執行sql語句的時候很簡單,找到屬於哪一類產品只需要 字段名=true 即可。 第二種前後臺只進行修改和判斷(像權限控制的時候),這時候通常的做法,數據庫中定義一個字段,在保存的時候循環複選框,形成字符串(像“1,2,3”這種形式)然後保存在數據庫中,在用到判斷屬性的地方,用split方法給分解成數組,然後來判斷,再深入一點,就把這些分解判斷的方法專門封裝出來,放入邏輯類中,需要時調用即可,這樣在數據相當龐大的時候數據庫字段維護相對簡單,缺點當然就是數據搜索的時候很是麻煩。 這兩種情況是我們在開發過程中經常可能用到的了,怎樣將二者的利弊折中呢,主要的問題就是多個屬性怎麼保存的問題,是一個屬性一個字段表示還是一個字段對應多個屬性,如果一個屬性一個字段,那麼數據庫中就會多個字段,後者則一個字段。 其實一個字段和多個字段的區別就在於:多個字段每個保存的信息單一控制時靈活,一個字段因爲是帶符號的字符串,雖然信息多但不容易檢索,如果我們能夠一個字段裏信息簡單但內容又能夠分解出不同信息,豈不妙哉! 當然大家可能會想到在數據庫中保存成xml字段來進行處理,這個當然好,不過對於一些最多也就十幾個的屬性的對象來說專門再進行xml處理倒有點大材小用了。這個時候就能體會二進制的好處了。 這裏用四位二進制來舉例:屬性A=1(二進制:0001),屬性B=2(二進制:0010),屬性C=4(二進制:0100),屬性D=8(二進制:1000)。我們假設一個對象有這四個屬性 現在把他們四個的二進制值進行或運算: 0 0 0 1 A 1 0 0 1 0 B 2 0 1 0 0 C 4 1 0 0 0 D 8 ----------------------------------------------------------------------- 1 1 1 1 或運算之後的值 15 如果我把這個15存入數據庫 在前臺我想知道該對象是否具有這個C屬性,改怎麼辦呢,很簡單: 把C的二進制值和15的二進制相與運算:
0 1 0 0 4
& 1 1 1 1 15
-------------------------------------
0 1 0 0 = 4
可以看到這個時候等於原值的
那麼我在數據庫中如果想要知道所有包含C屬性對象的集合
Select * from tableName where 4 & columnName=4 即可
至於在程序中怎麼處理與或運算,就不再多說了,很簡單的網上一搜一大堆。 當然這個方法還是有侷限的,例如現在int型爲32位,那我們定義的時候注意不要超出32個值,爲什麼呢,因爲這裏所有的二進制,相同位上是不容許出現兩個1的,如果出現 0001和0011這種肯定就不再適合了....