資料庫狀態標識位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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...