資料庫布林型狀態字段互斥性的SQL更新操作

2022-03-20 14:13:15 字數 1457 閱讀 7929

事件a和b的交集

為空,a與b就是互斥

事件,也叫互不相容

事件。也可敘述為:不可能同時發生的事件。如a∩b為不可能事件(a∩b=φ),那麼稱事件a與事件b互斥,其含義是:事件a與事件b在任何一次試驗中不會同時發生

在這樣的設計下,違反了第三正規化,應該拆分表為乙個狀態明細的基礎表,乙個選擇了的啟用狀態的記錄表,然而我們的資料庫設計中不可能總是達到第三正規化,這樣的設計給我們的查詢帶來了比較大的難度,需要有兩次join才可以

比如我們舉乙個簡單的例子,當前遊戲的兵器配置表中 系統啟用了某一種兵器作為預設兵器,(遊戲途中是可以切換的 系統有多種兵器) 現在狀態如下

該系統現在設定方天畫戟為預設**,如果在配置中想把兵器預設配置為 如意金箍棒,在以往我們的認知中 需要兩條sql

如此可完成將兵器配置從方天畫戟切換到如意金箍棒。

我們可以看到 採用兩條sql進行更新,可以達到效果。根據互斥原理,必須全部更新但是保留新資料的狀態,才能將啟用的資訊從id=3切換到id=4

改進的sql如下

採用if語句完成更新狀態的切換。優點是合併sql,缺點是採用了if函式,降低可讀性和效率了,當然開發者可以根據自己專案所處條件和環境來決定如何處理。

在上述問題只有兩種狀態可以切換的時候,就出現了ab兩個事件的互斥事件,這個時候,還有其他的辦法來解決上述問題。比如

魔法的使用情況 使用 放棄 兩種互斥事件產生,分別採用了兩行記錄來儲存(而且必須是兩行記錄 思考一下為什麼,為何不用乙個列字段來儲存呢?挖坑在此,請自己思考),而切換狀態的時候,必然是乙個啟用 ,乙個不啟用,那麼這個時候又該如何高效的處理呢?當然還是可以採用最基本的辦法兩條sql處理,效果如下

或者是我上面那種if方法來處理,當然我們還有其他辦法,在思考這個問題的時候,我們注意觀察到 狀態形成互斥0 和1 ,不正是資料型別中的布林型嗎?那麼布林型的轉換如何讓0變1 1變0呢?小學的數學公式告訴我們,加數與加數之間的互換可以有和來解決,所以0和1之間的切換可以有0+1=1的和1來解決,所以sql如下:

即解決了狀態的啟用在兩種互斥狀態中的切換!

關於資料庫設計中的狀態字段

quote 做資料庫設計的時候,某些表必須有乙個狀態字段.比如角色表,它的狀態為 已禁用 正常等。那是不是要單獨做一張角色狀態表呢?那麼其他表的中的狀態字段,是不是也要做一張對應的狀態表呢?即使狀態只有兩個值?如果這種狀態只有兩個值可以設定乙個欄位為bool型別 如果狀態包括多個值,但這些值不需要總...

資料庫 合併型的字段值操作

為了節省資料空間,減少記錄行數。很多人採用了如下的記錄方式來存貯資料 欄位名 好友列表 值型別 好友名1 好友名2 好友名3 好友名4 即各使用者名稱以分號等分隔符隔開,合併存在乙個欄位裡 程式執行結果 當前的字段值 lisi wangwu zhangsan 顯示取出的使用者 lisi wangwu...

mysql欄位排序語句 資料庫字段排序的SQL語句

簡明現代魔法 資料庫技術 資料庫字段排序的sql語句 資料庫字段排序的sql語句 2009 09 17 將字段依次寫在order by 後面即可 中間用逗號隔開。select from 表 order by time name select from 表 order by time asc name...