資料庫狀態標識位flag設計

来源:https://www.cnblogs.com/gouyg/archive/2018/11/02/mysql-flag-php.html
-Advertisement-
Play Games

設計目的: 減少各種狀態值欄位; 減少資料庫冗餘和存儲空間; 增加狀態值時可靈活調整,無需增加額外欄位 ...


設計目的

  • 減少各種狀態值欄位
  • 減少資料庫冗餘和存儲空間
  • 增加狀態值時可靈活調整,無需增加額外欄位

運用場景

例子1:管理用戶的支付方式

比如針對不同用戶組設置了不同的支付方式支持,假設支付方式有支付寶微信銀聯借條等。A用戶支持支付寶、微信;B用戶支持支付寶、微信、借條。一般用戶支付方式資料庫設計為:

ID name alipay weixin union iou
1 A 1 1 0 0
2 B 1 1 0 1

這時如果後續多了其它支付方式後,就需要調整表結構增加欄位,如快錢、貨到付款等。這種設計方式明顯不符合資料庫設計第一範式,增加了很多冗餘欄位和存儲空間。

例子2:設置用戶的操作許可權

比如有一組許可權列表,查看編輯發佈刪除,資料庫可能會是這樣:

ID name is_visible is_editble is_publishable is_deleteable
1 A 1 1 0 0
2 B 1 1 1 1

上面只是舉些例子來說明一個問題,當一張表的欄位里包含很多這些狀態值01時,我們可以使用二進位的方式來表示,而且只需要一個欄位就好了。

設計思路

比如例1中的支付方式,假設我們最多可設計有10種支付方式。

欄位仍設為int整形,A支持支付寶、微信,則值為12(1100);B支持支付寶、微信、借條,則值為13(1101),表結構如下:

ID name pay_flag
1 A 12
2 B 13

如果增加了貨到付款,可再賦值給二進位的第五位,其它位還是保持不變。

這時候會涉及到資料庫查詢問題,比如上面的值12、13都支持支付寶、微信,還有14(1110)、15(1111)也支持,如果增加了二進位第五位,那麼會有更多匹配值,如30(11110)、28(11100)等...
如果要查詢支持支付寶、微信的數據怎麼辦?這時只需要通過“位”的與運算,就能簡單的查詢出想要數據:

select * from user_pay where pay_flag & b'1100';
# 或者:  
select * from user_pay where pay_flag & 12;

php簡單實現

class PayFlag {
    const ALIPAY = 8; //01000
    const WEIXIN = 4; //00100
    const UNION  = 2; //00010
    const IOU    = 1; //00001

    function addFlag($old_flag, $flag) {
        return $old_flag | $flag;
    }

    function delFlag($old_flag, $flag) {
        return $old_flag ^ $flag;
    } 
}

$old_flag = 6; //00110
$PayFlag = new PayFlag;

//原有值 - 輸出 6:110
echo($old_flag  . ":" . decbin($old_flag) . PHP_EOL);

//增加ALIPAY - 輸出 14:1110
$new_flag = $PayFlag->addFlag($old_flag, PayFlag::ALIPAY);
echo($new_flag . ":" . decbin($new_flag) . PHP_EOL);

//移除ALIPAY - 輸出 6:110
$new_flag = $PayFlag->delFlag($new_flag, PayFlag::ALIPAY);
echo($new_flag . ":" . decbin($new_flag) . PHP_EOL);

//移除UNION - 輸出 4:100
$new_flag = $PayFlag->delFlag($new_flag, PayFlag::UNION);
echo($new_flag . ":" . decbin($new_flag) . PHP_EOL);

//增加IOU - 輸出 5:101
$new_flag = $PayFlag->delFlag($new_flag, PayFlag::IOU);
echo($new_flag . ":" . decbin($new_flag) . PHP_EOL);

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 - 在啟動grub菜單,選擇編輯選項啟動 2 - 按鍵盤e鍵,來進入編輯界面 3 - 找到Linux 16的那一行,將ro改為rw init=/sysroot/bin/sh 4 - 現在按下 Control+x ,使用單用戶模式啟動 5 - 現在,可以使用下麵的命令訪問系統 chroot /sy ...
  • ex2fsck 檢查ext2、ext3、ext4文件系統,如果系統已經掛載了,那麼不建議去檢查,因為這樣是不安全的。此命令的適用範圍:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。 1、語法 e2fsck [-pacnyrdfkvtDFV] [-b s ...
  • 查看方式 1、先切換到:cd usr/local/tomcat5/logs2、tail -f catalina.out3、Ctrl+c 是退出tail命令/alt+E+R重置 Linux系統中tail命令 實例1:顯示文件末尾內容 tail -n 5 log2014.log 顯示文件最後5行內容 實 ...
  • 1 非搶占式和可搶占式內核 為了簡化問題,我使用嵌入式實時系統uC/OS作為例子 首先要指出的是,uC/OS只有內核態,沒有用戶態,這和Linux不一樣 多任務系統中, 內核負責管理各個任務, 或者說為每個任務分配CPU時間, 並且負責任務之間的通訊. 內核提供的基本服務是任務切換. 調度(Sche ...
  • 一、man命令介紹 man,為單詞manual的縮寫,是linux下的幫助指令。 二、實例 以man命令為例,輸入 man man 獲取man命令的幫助文檔 可以看出,使用man命令查詢到的幫助信息很多,所以我們需要瞭解幫助文檔信息的目錄結構和操作方法。 三、目錄結構 名稱 意義 NAME 命令名稱 ...
  • 文章的格式也許不是很好看,也沒有什麼合理的順序 完全是想到什麼寫一些什麼,但各個方面都涵蓋到了 能耐下心看的朋友歡迎一起學習,大牛和杠精們請繞道 Exploit模塊分為主動和被動(Active、Passive) 主動:主動地向目標機器發送payload並執行,使目標交出shell(反連等) 被動:利 ...
  • 伺服器 swap 交換分區製作 作用:‘提升‘ 記憶體的容量,防止OOM(Out Of Memory) 查看當前的交換分區 增加交換分區 可是是分區,LVM,File file創建: 1、新建一個專門的文件用於swap分區 註:此文件的大小是count的大小乘以bs大小,上面命令的大小是4GB 2、通 ...
  • linux的touch命令一般用來修改文件時間戳,或者新建一個不存在的文件。 一.命令格式: touch [參數]... 文件... 二.命令參數: |參數|描述| | | | | a | 或 time=atime或 time=access或 time=use 只更改存取時間。| | c | 或 n ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...