web開發中,巧妙解決數據庫字段過多的問題:Java位操作

在web開發過程中,我們大多都會碰到類似這樣一個問題:(p2p)一個【標的】中,是否新手標,是否加息標,是否邏輯刪除 等等,一般開發者會給定3個字段分別存儲,但是當以後業務擴展了 是否滿標,是否生成回款表... 這就無止境了。其實,我們仔細分析不難發現:是否新手標/加息標/邏輯刪除 這些維度的值都是一樣的:要麼是,要麼不是。這與計算機世界的 0/1 非常吻合,今天也是以 0/1為切入點來解決此類問題。

計算機是 0/1 的世界: 10對應十進制2,100對於十進制4,1000對應十進制8,而1000(二進制數) 已經可以表示4個維度了(一個位表示一個維度)。

Java中位與運算符 ( & ) ,兩個數都轉為二進制,然後從高位開始比較,如果兩個數都為1則為1,否則為0。我我們可以利用這個特性來做校驗/判斷等操作

Java中位或運算符 ( | ) , 兩個數都轉為二進制,然後從高位開始比較,兩個數只要有一個為1則為1,否則就為0。我們可以利用這個特性來做一些設定操作

基於以上原理我們便可以寫出以下代碼:

web開發中,巧妙解決數據庫字段過多的問題:Java位操作

標 屬性操作類

對於數據庫的話我們只需要一個字段(attr)就夠了,寫代碼的時候我們只需要

AssetProperty property = new AssetProperty();
property.setNewer(); //設置新手標
property.setAddRate(); //設置為加息標

然後將AssetProperty 的val值入庫attr字段即可。

那怎麼判斷已入庫的attr是否符合某一維度呢,比如判斷是否是新手標,代碼如下:

AssetProperty property = new AssetProperty(attr); //attr為數據庫取出的值
property.isNewer(); //返回true
property.isAddRate(); //返回true

而property.isDel(); 肯定是返回false的。

數據庫對應的操作也是有模有樣的,sql語句如下:

select * from table where attr & 2 = 2 ;

Java位操作還可以解決後續擴展的問題,程序中我們可以看出目前只用到了三個維度 1 << 3,即2^3=8,java的Long類型最多能支持多少個維度就不用我說了吧,擴展空間還是非常充足的。


分享到:


相關文章: