程式開發中,經常遇到一條記錄有多個狀態位,比如一條商品,他屬於熱門,新品,特賣。我們的資料庫如何設計呢? 一般有幾種方法 (1)建立關聯表 關聯表欄位:關係Id,商品Id,屬性Id 查詢:使用關聯表的方式,查詢某屬性的商品。 程式:寫入時,寫商品表和關聯表; (2)將多個屬性存在一個欄位中,用|分割 ...
程式開發中,經常遇到一條記錄有多個狀態位,比如一條商品,他屬於熱門,新品,特賣。我們的資料庫如何設計呢? 一般有幾種方法 (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)增加了理解複雜度; 以下是四個狀態情況的二進位與十進位存儲對照表: