## awesomes-tables

那些極好的表設計
* * * * *
#### 短信驗證碼 表
短信驗證碼表(id,標識名/業務標識,驗證碼,手機號碼,創建時間,發送時間,發送狀態,有效時間,錯誤驗證次數,狀態。頁面key?)
* * * * *
#### 用戶表
```sql
-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `fn_admin` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '管理員用戶ID',
`nickname` char(16) NOT NULL DEFAULT '' COMMENT '昵稱',
`avatar` varchar(500) NOT NULL DEFAULT '' COMMENT '頭像',
`password` char(40) NOT NULL DEFAULT '' COMMENT '用戶密碼',
`salt` char(32) NOT NULL DEFAULT '' COMMENT '用于保護用戶密碼安全的鹽值',
-- 這個用戶郵箱和手機是唯一的,但是有的人開始并沒有綁定郵箱或手機,所以也不能為空串,不然唯一沖突,所以只能允許為空null了,并且默認為null
`email` char(32) NULL DEFAULT NULL COMMENT '用戶郵箱(可用作登錄名)',
`mobile` char(15) NULL DEFAULT NULL COMMENT '用戶手機(可用作登錄名)',
`login` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '登錄次數',
`create_ip` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '注冊IP',
`create_time` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '注冊時間',
`last_login_ip` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '最后登錄IP',
`last_login_time` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '最后登錄時間',
`update_time` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '更新時間',
`status` tinyint(4) unsigned NOT NULL DEFAULT 0 COMMENT '狀態',
PRIMARY KEY (`id`),
UNIQUE KEY `nickname` (`nickname`) USING BTREE,
UNIQUE KEY `email` (`email`) USING BTREE,
UNIQUE KEY `mobile` (`mobile`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用戶 表';
-- ----------------------------
-- Records of user
-- ----------------------------
```
* * * * *
#### 系統通知消息表(通知類消息而非廣播類消息)
```sql
-- ----------------------------
-- table structure for `a_system_notification`
-- ----------------------------
DROP TABLE IF EXISTS `a_system_notification`;
CREATE TABLE `a_system_notification` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`recipient` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '接收者 用戶ID',
`title` varchar(64) NOT NULL DEFAULT '' COMMENT '消息標題',
`content` text NULL COMMENT '消息內容',
`payload` text NULL COMMENT '載荷/參數,可攜帶業務方數據,如綁定通知時攜帶下級的用戶信息,在通知模板中會用到',
`create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '發送時間',
`is_red` tinyint(4) unsigned NOT NULL DEFAULT 0 COMMENT '是否閱讀了',
`type` tinyint(4) unsigned NOT NULL DEFAULT 0 COMMENT '消息類型:0-系統普通消息,1-新人注冊通知,2-下級成功綁定通知',
primary key (`id`)
) engine=innodb AUTO_INCREMENT=1 default charset=utf8 COMMENT='系統通知消息 表';
-- ----------------------------
-- records of a_system_notification
-- ----------------------------
```
[用戶消息通知系統 · 產品設計 · 看云](http://www.hmoore.net/xiak/product/590024)
(只有一條母消息,其它為消息狀態,這樣的消息為廣播消息。廣播類消息要用這樣的母消息。)
>[tip] 不要直接將業務數據給到消息載荷,不要讓它(消息處理/消息獲取對象)自己去解析,它沒這個義務去幫你解析業務數據,請直接給完整的數據,比如用戶信息就不要只給uid,訂單數據就不要只給訂單id,狀態就不要只給狀態值,狀態文字也要一并解析好再給它。
>
> 對于業務通知類消息,消息創建時間不可能在業務時間之前(這個細節不要忽視)。因為消息通知是由于業務動作產生的。
* * * * *
#### 信息流
信息流系統,業務表,信息表 信息類型 有的類型是沒有對應業務的 比如點贊 說說有業務表,業務id,用戶,消息表 信息id,消息接受者,是否已讀
業務表可能是人,文章,項目,相冊等,具體根據信息類型來確定,比如點贊文章,關注項目,關注人,點贊相冊
[feed留,單聊群聊,系統通知,狀態同步,到底是推還是拉?](https://mp.weixin.qq.com/s/54yEWWet9mFztv1fO_GTqQ)
> 【feed & flow】重要消息用推,不重要消息用拉,另外qq只有開會員才有好友上線提醒吧,所以根據用戶可以區分對待。消息閱讀狀態肯定是要有的,姚晨發一條微博,表中只有一條消息記錄,但是n個充錢粉絲,都各自有一條對應記錄(消息表id,接受者,發送時間,閱讀狀態),這樣就可以記錄用戶閱讀狀態了,而無需存n條消息。消息推送放到隊列里面去就可以了
[系統通知,居然有人使用拉取](https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651961154&idx=1&sn=277f6ec612555bf5a95585e9a161bb5f&chksm=bd2d029e8a5a8b884c9855b8e315a697a0e8eccf227fb36395334d140dd9eebf2489e99862d3&scene=21#wechat_redirect)
[狀態同步,究竟是推還是拉?](https://mp.weixin.qq.com/s/oQ4K4zMRCGRtqly412U_TQ)
* * * * *
#### 第三方oauth
~~~
OAuth:
網絡釋義
OAuth: OAuth
OpenID OAuth: 提供像第三方登錄服務
OAuth authentication: OAuth認證
Auth:
基本翻譯
n. (Auth)人名;(德、匈、英)奧特
abbr. 自生的(authentic);授權的(authorized)
網絡釋義
Auth: 聯盟
GFA Auth: 身份認證系統
Group auth: 組認證
~~~
oauth_platform_subject(平臺主體,類似于微信開放平臺,可滿足某些業務場景)
oauth_platform
oauth_account
oauth_connect
oauth_user_bind
oauth_access_token(應用授權令牌 表)
oauth_user_access_token(用戶授權訪問令牌 表)
~~~
平臺主體(id,name)
第三方oauth平臺表(id,平臺名,平臺標識,logo,創建時間,字段json)QQ,微信公眾號,微信小程序,微信企業號(跟接口有關,平臺都對應有接口文件,這個數據比較穩定,除非第三方平臺接口發生變化了,此時也要跟著升級接口)
oauth賬號表(id,平臺id,數據json,name,創建時間,是否啟用,是否支持unionid,是否為oauth賬號/一個平臺只能有一個oauth賬號,是否開啟URL響應,響應接入狀態,最后響應時間,關聯的平臺中心)(創建后,系統正式運行后就不能輕易更改了,因為oAuth用戶數據已經生成了)(2 3 唯一索引)
oauth_connect(id,oauth賬號id,openid,unionid,return_json接口返回的用戶信息,update_time)2 3 唯一索引
oauth_user_bind(id, oauth_connect_id,user_id,bind_time)2 3 唯一索引
user
oauth_access_token(oauth賬號id,access_token,refresh_token,expires_in,update_time)
oauth_user_access_token(oauth_user_bind_id,access_token,refresh_token,expires_in,update_time)
~~~
>[danger] **我們認為:一個人為一個用戶,一個手機號碼即為一個用戶,一個用戶對應一個社交賬號(一個人在一個社交平臺上只有一個賬號)**(這個規則很重要,要嚴格檢查,不然可能會出現不符合正常邏輯的問題)。由于unionid的出現,所以一個user不再是只有一個openid了(可以一對多的關系)。而除了微信,其它第三方沒有提供unionid,所以一個用戶只能綁定一個oauth_account。
>
><del>(其實即使沒有unionid其實我們也可以實現一個用戶綁定多個oauth_account)(實現方式:已登錄狀態下,`post: bind.php token oauth_account_id; ;跳轉;響應;換取用戶信息;綁定` 就可以了)。</del>
> 不行,這樣可能出現用戶綁定一個平臺下的多個不同社交賬號!所以除了微信這樣的支持unionid的平臺外,其它的都不能這樣,用戶只能綁定同一個平臺下的一個賬號。
> 一般來說,一個公司就一個公眾賬號平臺,但是也存在一個公司多個公眾號的情況,所以要求用戶綁定多個也可以,對于用戶來說就是綁定你的多個公眾平臺(一種下面的多個賬戶,如綁定京東微信,京東金融,發生交易時你會收到兩個公眾號的提醒,不過一般對于用戶來說,就只綁定一個主的,就是京東這個公眾號),這樣就可以多個公眾號向用戶推送信息了。
參考:[賬戶授權相關 · php筆記 · 看云](http://www.hmoore.net/xiak/php-node/638595)

* * * * *
#### 第三方支付平臺
payment_platform
payment_account
~~~
第三方支付平臺表(id,平臺名,平臺標識,logo,創建時間,字段json)微信支付,支付寶,京東支付(跟接口有關,平臺都對應有接口文件)
支付賬號表(id,平臺id,數據json,name,創建時間,是否啟用,是否默認/一個平臺只能有一個默認的——被作為支付渠道,關聯的oauth_account_id)(2 3 唯一索引)(有時有一些聯系,可以關聯oauth_account,以滿足某些業務邏輯)
~~~
* * * * *
#### 用戶關注記錄表
user_subscribe_record(user_id,oauth_account_id,event,create_time)
* * * * *
#### 用戶關注狀態表
user_subscribe_status(user_id,oauth_account_id,subscribe)
(關注不是綁定)
* * * * *
#### 用戶賬號綁定信息
綁定郵箱,綁定手機號碼,綁定時間,時間太長了就要提醒用戶重新驗證。
user_account_bind_info(email,email_bind_status,email_bind_time,mobile,mobile_bind_status,mobile_bind_time,user_id)
用戶表需要反三范式,存儲郵箱和手機號碼。
* * * * *
### 用戶會話上下文表
在無session概念的服務里充當session,儲存用戶會話中上下文信息。 **(注意這并不是session表哦)**
(id,user_id,json_data)
* * * * *
### 鎖
用表來一個鎖。
locks(lock_name)
復雜一點的可以實現信號量
locks(lock_name,semaphore,current_semaphore,status)
(要使用支持行鎖的存儲引擎 Innodb)
* * * * *
### 進程狀態表
(進程ID,進程標識,當前狀態,上次運行時間,運行次數,備注,……)
* * * * *


* * * * *
last update:2018-6-22 12:37:24
- 開始
- 公益
- 更好的使用看云
- 推薦書單
- 優秀資源整理
- 技術文章寫作規范
- SublimeText - 編碼利器
- PSR-0/PSR-4命名標準
- php的多進程實驗分析
- 高級PHP
- 進程
- 信號
- 事件
- IO模型
- 同步、異步
- socket
- Swoole
- PHP擴展
- Composer
- easyswoole
- php多線程
- 守護程序
- 文件鎖
- s-socket
- aphp
- 隊列&并發
- 隊列
- 講個故事
- 如何最大效率的問題
- 訪問式的web服務(一)
- 訪問式的web服務(二)
- 請求
- 瀏覽器訪問阻塞問題
- Swoole
- 你必須理解的計算機核心概念 - 碼農翻身
- CPU阿甘 - 碼農翻身
- 異步通知,那我要怎么通知你啊?
- 實時操作系統
- 深入實時 Linux
- Redis 實現隊列
- redis與隊列
- 定時-時鐘-阻塞
- 計算機的生命
- 多進程/多線程
- 進程通信
- 拜占庭將軍問題深入探討
- JAVA CAS原理深度分析
- 隊列的思考
- 走進并發的世界
- 鎖
- 事務筆記
- 并發問題帶來的后果
- 為什么說樂觀鎖是安全的
- 內存鎖與內存事務 - 劉小兵2014
- 加鎖還是不加鎖,這是一個問題 - 碼農翻身
- 編程世界的那把鎖 - 碼農翻身
- 如何保證萬無一失
- 傳統事務與柔性事務
- 大白話搞懂什么是同步/異步/阻塞/非阻塞
- redis實現鎖
- 淺談mysql事務
- PHP異常
- php錯誤
- 文件加載
- 路由與偽靜態
- URL模式之分析
- 字符串處理
- 正則表達式
- 數組合并與+
- 文件上傳
- 常用驗證與過濾
- 記錄
- 趣圖
- foreach需要注意的問題
- Discuz!筆記
- 程序設計思維
- 抽象與具體
- 配置
- 關于如何學習的思考
- 編程思維
- 談編程
- 如何安全的修改對象
- 臨時
- 臨時筆記
- 透過問題看本質
- 程序后門
- 邊界檢查
- session
- 安全
- 王垠
- 第三方數據接口
- 驗證碼問題
- 還是少不了虛擬機
- 程序員如何談戀愛
- 程序員為什么要一直改BUG,為什么不能一次性把代碼寫好?
- 碎碎念
- 算法
- 實用代碼
- 相對私密與絕對私密
- 學習目標
- 隨記
- 編程小知識
- foo
- 落盤
- URL編碼的思考
- 字符編碼
- Elasticsearch
- TCP-IP協議
- 碎碎念2
- Grafana
- EFK、ELK
- RPC
- 依賴注入
- 科目一
- 開發筆記
- 經緯度格式轉換
- php時區問題
- 解決本地開發時調用遠程AIP跨域問題
- 后期靜態綁定
- 談tp的跳轉提示頁面
- 無限分類問題
- 生成微縮圖
- MVC名詞
- MVC架構
- 也許模塊不是唯一的答案
- 哈希算法
- 開發后臺
- 軟件設計架構
- mysql表字段設計
- 上傳表如何設計
- 二開心得
- awesomes-tables
- 安全的代碼部署
- 微信開發筆記
- 賬戶授權相關
- 小程序獲取是否關注其公眾號
- 支付相關
- 提交訂單
- 微信支付筆記
- 支付接口筆記
- 支付中心開發
- 下單與支付
- 支付流程設計
- 訂單與支付設計
- 敏感操作驗證
- 排序設計
- 代碼的運行環境
- 搜索關鍵字的顯示處理
- 接口異步更新ip信息
- 圖片處理
- 項目搭建
- 閱讀文檔的新方式
- mysql_insert_id并發問題思考
- 行鎖注意事項
- 細節注意
- 如何處理用戶的輸入
- 不可見的字符
- 抽獎
- 時間處理
- 應用開發實戰
- python 學習記錄
- Scrapy 教程
- Playwright 教程
- stealth.min.js
- Selenium 教程
- requests 教程
- pyautogui 教程
- Flask 教程
- PyInstaller 教程
- 蜘蛛
- python 文檔相似度驗證
- thinkphp5.0數據庫與模型的研究
- workerman進程管理
- workerman網絡分析
- java學習記錄
- docker
- 筆記
- kubernetes
- Kubernetes
- PaddlePaddle
- composer
- oneinstack
- 人工智能 AI
- 京東
- pc_detailpage_wareBusiness
- doc
- 電商網站設計
- iwebshop
- 商品規格分析
- 商品屬性分析
- tpshop
- 商品規格分析
- 商品屬性分析
- 電商表設計
- 設計記錄
- 優惠券
- 生成唯一訂單號
- 購物車技術
- 分類與類型
- 微信登錄與綁定
- 京東到家庫存系統架構設計
- crmeb
- 命名規范
- Nginx https配置
- 關于人工智能
- 從人的思考方式到二叉樹
- 架構
- 今日有感
- 文章保存
- 安全背后: 瀏覽器是如何校驗證書的
- 避不開的分布式事務
- devops自動化運維、部署、測試的最后一公里 —— ApiFox 云時代的接口管理工具
- 找到自己今生要做的事
- 自動化生活
- 開源與漿果
- Apifox: API 接口自動化測試指南