關於二進制在多屬性上的作用

 

    曾經在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這種肯定就不再適合了....

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章