日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库状态标识位flag设计

發(fā)布時間:2024/4/15 数据库 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库状态标识位flag设计 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

設(shè)計目的

  • 減少各種狀態(tài)值字段
  • 減少數(shù)據(jù)庫冗余和存儲空間
  • 增加狀態(tài)值時可靈活調(diào)整,無需增加額外字段

運用場景

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

比如針對不同用戶組設(shè)置了不同的支付方式支持,假設(shè)支付方式有支付寶、微信、銀聯(lián)、借條等。A用戶支持支付寶、微信;B用戶支持支付寶、微信、借條。一般用戶支付方式數(shù)據(jù)庫設(shè)計為:

IDnamealipayweixinunioniou
1A1100
2B1101

這時如果后續(xù)多了其它支付方式后,就需要調(diào)整表結(jié)構(gòu)增加字段,如快錢、貨到付款等。這種設(shè)計方式明顯不符合數(shù)據(jù)庫設(shè)計第一范式,增加了很多冗余字段和存儲空間。

例子2:設(shè)置用戶的操作權(quán)限

比如有一組權(quán)限列表,查看,編輯,發(fā)布,刪除,數(shù)據(jù)庫可能會是這樣:

IDnameis_visibleis_editbleis_publishableis_deleteable
1A1100
2B1111

上面只是舉些例子來說明一個問題,當(dāng)一張表的字段里包含很多這些狀態(tài)值01時,我們可以使用二進(jìn)制位的方式來表示,而且只需要一個字段就好了。

設(shè)計思路

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

字段仍設(shè)為int整形,A支持支付寶、微信,則值為12(1100);B支持支付寶、微信、借條,則值為13(1101),表結(jié)構(gòu)如下:

IDnamepay_flag
1A12
2B13

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

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

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

php簡單實現(xiàn)

class PayFlag {const ALIPAY = 8; //01000const WEIXIN = 4; //00100const UNION = 2; //00010const IOU = 1; //00001function 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);

轉(zhuǎn)載于:https://www.cnblogs.com/gouyg/p/mysql-flag-php.html

總結(jié)

以上是生活随笔為你收集整理的数据库状态标识位flag设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。