數據庫擴展性設計:使用二進制解決一條記錄關聯多個狀態的問題

程序開發中,常常遇到一條記錄有多個狀態位,好比一條商品,他屬於熱門,新品,特賣。咱們的數據庫如何設計呢?
通常有幾種方法
(1)創建關聯表
關聯表字段:關係Id,商品Id,屬性Id
查詢:使用關聯表的方式,查詢某屬性的商品。
程序:寫入時,寫商品表和關聯表;
 
(2)將多個屬性存在一個字段中,用|分割
狀態存儲在一個字段中,好比某條商品屬於熱賣,新品和特賣,則字段存儲的值:01|02|03
SQL查詢:使用like
程序處理:(1)取值須要先將01,02,03分割,再處理。(2)寫入須要先將01,02,03組合爲一個字符串再存儲。
 
以上兩種方法能夠能夠解決多個狀態關聯的問題,可是存在如下問題
(1)增長了表和程序複雜度;
(2)須要改代碼,不利於擴展;
 
有沒有更好的方法,處理一條記錄多個狀態的問題呢?
使用二進制位,每一個位置,表明一個狀態,多個位置表明多個狀態,存儲的時候轉換爲int類型存儲。
 
以產品屬性存儲爲例。
熱門:0000 0001
新品:0000 0010
特賣:0000 0100
 
多個狀態的組合
熱門+新品:0000 0011
熱門+特賣:0000 0101
熱門+新品+特賣:0000 0111
 
存儲時將二進制轉換爲int數值。
 
二進制位的查詢
以Oracle爲例,使用bitadd函數,如:
SELECT * FROM T_PRODUCT WHERE bitand (property, 1 )= 1
 
java中對二進制位的處理
1)是否包含:&與運算符,好比:(1&3)==1
2)組裝:|或運算符,好比 1|2=3
 
若是再擴展,清倉狀態,能夠使用 0000 1000
 
二進制實現的好處
以上內容講解了使用二進制位來表示狀態的方式,實現數據庫設計和程序調用。有如下好處
1)存儲精簡
2)擴展性強
 
缺點:
1)增長了理解複雜度;
 
如下是四個狀態狀況的二進制與十進制存儲對照表:
 
相關文章
相關標籤/搜索