在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工廠
實現**如下:
private3.列舉的轉換----列舉值的分解int enummerger(params
int enumval)
}return
sumenum;
}
資料庫儲存的列舉值是33,33分解後為1,32 分別對應p1,p7兩個工廠
如何將這個值分解轉為對應的值呢
實現**:
1了解sql server 列舉值的分解,private list enumsplit(int
enumcount)211
}12return
listenumval;
13 }
二.採用列舉值後,對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...