PCB SQL SERVER 位運算應用例項

2022-02-10 14:26:24 字數 2300 閱讀 6842

在pcb行業,乙個產品可能同時在多個工廠生產,舉例:乙個產品一條主記錄,這條記錄中會對應多個工廠的產地,而這個工廠產地個數不確定,

那麼如何設計表結構儲存這個不確定的工廠呢?這裡想到了4個方式儲存

一.主外來鍵一對多的方式

產品為主鍵,主表,而工廠放到外來鍵,為副表,這樣就可以實現一對多的方式。

二.主表中,乙個字段存放多個工廠產地

在乙個工廠產地中存放多個產地用,分隔;   如乙個欄位中存放:p1,p2,p3

三.主表中,每個工廠對應乙個字段

比如:已知8個工廠,那麼在主表建立8個工廠字段存放對應的工廠產地.

四.主表中,乙個欄位存中存放工廠產地的列舉值      接下來就是以這種方式實現

比如:p1工廠列舉值為1,     p2工廠列舉值為2, p3工廠列舉值為4

同時滿足p1工廠,p2工廠,兩個工廠  列舉值為3

同時滿足p1工廠,p2工廠,p3工廠, ,  三個工廠  列舉值為7

這裡不討論各種表結構資料儲存方式或後續資料分析影響的利敝,這裡只是擴充套件一種思路,對列舉值的儲存方式的加以應用

一.採用列舉值儲存要準備什麼呢?

1.已知

單個列舉值清單

十進位制帶表列舉的值,每個值帶表對應的工廠

2.列舉的轉換----列舉值的合併

假如我們前端ui吧,顯示p1,p7兩個工廠,對應的單個列舉值為1,32

而資料庫儲存的列舉值只有乙個數值,怎麼轉換為乙個值了

通過|或運算, 1 | 32 = 33  那麼資料加儲存的值應該是33,

這個33帶表是p1與p7工廠

實現**如下:   

private

int enummerger(params

int enumval)

}return

sumenum;

}

3.列舉的轉換----列舉值的分解

資料庫儲存的列舉值是33,33分解後為1,32   分別對應p1,p7兩個工廠

如何將這個值分解轉為對應的值呢

實現**:

1

private list enumsplit(int

enumcount)211

}12return

listenumval;

13 }

了解sql server 列舉值的分解,

二.採用列舉值後,對sql查詢是否能滿足要求了,這裡對幾種查詢進行驗證測試

1.單個工廠值相等測試

列舉值:32查詢     代表:p7工廠

實際值:p7查詢    

測試:結果一致

2.like包含單個工廠值測試

列舉值:32查詢     代表:p7工廠

實際值:p7查詢    

測試:結果一致

3.like包含2個工廠值測試

列舉值:33查詢     代表:p1工廠與p7工廠

實際值:p1,p7查詢    

測試:結果一致

4.二個工廠值相等測試

列舉值:33查詢     代表:p1工廠與p7工廠

實際值:p1,p7查詢    

測試:結果一致

小結:1.測試結果:

從這個測試結果看,通過列舉值應在在字段中效果也是不錯的,和用like對比結果都是一致的.

證明採用這樣的列舉值儲存多個值也是ok的。

2.列舉位數量:

採用位運算儲存實際是將多種狀態值對映為乙個值,且數值是2的n次方關係,即1,2,4,8,16,32,64,128等等,

如果儲存上百種狀態,值會溢位,所以當狀態太多了不建議使用此種方式.

3.列舉位查詢效能:

採用位運算效能是非常高的,二進位制運算速率是遠大於聯表與字串拼接,

但採用位運算意味著逐行處理,因為查詢時無法命中索引,當資料量大了後,後果是災難性的。

所以當表容量很大時,不建議採用位運算

位運算(1) 初識位運算

前段時間數電課學了些進製轉換,還有與或非等邏輯運算,如今再來看看位運算,倒輕鬆了不少。很早就想寫些非總結性部落格了,奈何還是太懶。也也不知怎的突然又來了興致,趕忙寫下這篇部落格。廢話不多說,今天準備總結總結關於位運算的知識。程式中的所有數在計算機記憶體中都是以二進位制的形式儲存的,即0 1兩種狀態,...

位運算子和位運算

一 按位與 運算子 1 運算規則 參加運算的兩個 資料,按二進位進行 與 運算,如果兩個相應的二進位都為1,則該位的結果值為1,否則為0,即 0 0 0,0 1 0,1 0 0,1 1 1.2 用途 1 清零 運算物件 原來的數中為1的位,新數中相應位為0。2 取乙個數中某些指定位。如想要取乙個整數...

位運算子與位運算

位運算是對二進位制位的操作,它應用於整形資料,把整形資料看成固定的二進位制序列,然後對二進位制序列進行位運算 按位與運算 按位與運算子 是雙目運算子。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 否則為0。參與運算的數以補碼方式出現。例c a b a 1010...