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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL基础篇(02):从五个维度出发,审视表结构设计

發布時間:2025/3/16 数据库 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL基础篇(02):从五个维度出发,审视表结构设计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文源碼:GitHub·點這里 || GitEE·點這里

一、數據場景

1、表結構簡介

任何工具類的東西都是為了解決某個場景下的問題,比如Redis緩存系統熱點數據,ClickHouse解決海量數據的實時分析,MySQL關系型數據庫存儲結構化數據。數據的存儲則需要設計對應的表結構,清楚的表結構,有助于快速開發業務,和理解系統。表結構的設計通常從下面幾個方面考慮:業務場景、設計規范、表結構、字段屬性、數據管理。

2、用戶場景

例如存儲用戶基礎信息數據,通常都會下面幾個相關表結構:用戶信息表、單點登錄表、狀態管理表、支付賬戶表等。

  • 用戶信息表

存儲用戶三要素相關信息:姓名,手機號,身份證,登錄密碼,郵箱等。

CREATE TABLE `ms_user_center` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶ID',`user_name` varchar(20) NOT NULL COMMENT '用戶名',`real_name` varchar(20) DEFAULT NULL COMMENT '真實姓名',`pass_word` varchar(32) NOT NULL COMMENT '密碼',`phone` varchar(20) NOT NULL COMMENT '手機號',`email` varchar(32) DEFAULT NULL COMMENT '郵箱',`head_url` varchar(100) DEFAULT NULL COMMENT '用戶頭像URL',`card_id` varchar(32) DEFAULT NULL COMMENT '身份證號',`user_sex` int(1) DEFAULT '1' COMMENT '用戶性別:0-女,1-男',`create_time` datetime DEFAULT NULL COMMENT '創建時間',`update_time` datetime DEFAULT NULL COMMENT '更新時間',`state` int(1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用',PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶表';
  • 單點登錄表

用意是在多個業務系統中,用戶登錄一次就可以訪問所有相互信任的業務子系統,是聚合業務平臺常用的解決方案。

CREATE TABLE `ms_user_sso` (`user_id` int(11) NOT NULL COMMENT '用戶ID',`sso_id` varchar(32) NOT NULL COMMENT '單點信息編號ID',`sso_code` varchar(32) NOT NULL COMMENT '單點登錄碼,唯一核心標識',`log_ip` varchar(32) DEFAULT NULL COMMENT '登錄IP地址',`create_time` datetime DEFAULT NULL COMMENT '創建時間',`update_time` datetime DEFAULT NULL COMMENT '更新時間',`state` int(1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用',PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶單點登錄表';
  • 狀態管理表

系統用戶在使用時候可能出現多個狀態,例如賬戶凍結、密碼鎖定等,把狀態聚合到一起,可以更加方便的管理和驗證。

CREATE TABLE `ms_user_status` (`user_id` int(11) NOT NULL COMMENT '用戶ID',`account_status` int(1) DEFAULT '1' COMMENT '賬戶狀態:0-凍結,1-未凍結',`real_name_status` int(1) DEFAULT '0' COMMENT '實名認證狀態:0-未實名,1-已實名',`pay_pass_status` int(1) DEFAULT '0' COMMENT '支付密碼是否設置:0-未設置,1-設置',`wallet_pass_status` int(1) DEFAULT '0' COMMENT '錢包密碼是否設置:0-未設置,1-設置',`wallet_status` int(1) DEFAULT '1' COMMENT '錢包是否凍結:0-凍結,1-未凍結',`email_status` int(1) DEFAULT '0' COMMENT '郵箱狀態:0-未激活,1-激活',`message_status` int(1) DEFAULT '1' COMMENT '短信提醒開啟:0-未開啟,1-開啟',`letter_status` int(1) DEFAULT '1' COMMENT '站內信提醒開啟:0-未開啟,1-開啟',`emailmsg_status` int(1) DEFAULT '0' COMMENT '郵件提醒開啟:0-未開啟,1-開啟',`create_time` datetime DEFAULT NULL COMMENT '創建時間',`update_time` datetime DEFAULT NULL COMMENT '更新時間',`state` int(1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用',PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶狀態表';
  • 支付賬戶表

用戶交易的核心表,存儲用戶相關的賬戶資金信息。

CREATE TABLE `ms_user_wallet` (`wallet_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '錢包ID',`user_id` int(11) NOT NULL COMMENT '用戶ID',`wallet_pwd` varchar(32) DEFAULT NULL COMMENT '錢包密碼',`total_account` decimal(20,2) DEFAULT '0.00' COMMENT '賬戶總額',`usable_money` decimal(20,2) DEFAULT '0.00' COMMENT '可用余額',`freeze_money` decimal(20,2) DEFAULT '0.00' COMMENT '凍結金額',`freeze_time` datetime DEFAULT NULL COMMENT '凍結時間',`thaw_time` datetime DEFAULT NULL COMMENT '解凍時間',`create_time` datetime DEFAULT NULL COMMENT '創建時間',`update_time` datetime DEFAULT NULL COMMENT '更新時間',`state` int(1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用',PRIMARY KEY (`wallet_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶錢包';

二、設計規范

1、涉及模塊

通過上面幾個表設計的案例,可以看到表設計關聯到數據庫的各個方面知識:數據類型,索引,編碼,存儲引擎等。表設計是一個很大的命題,不過也遵循一個基本規范:三范式。

2、三范式

  • 基礎概念

一范式

表的列的具有原子性,不可再分解,即列的信息,不能分解,關系型數據庫MySQL、Oracle等自動的滿足。

二范式

每個事實的數據記錄只會出現一次, 不會冗余, 通常設計一個主鍵來實現。

三范式

要求一個表中不包含已經存在于其它表的非主鍵信息,例如部門和員工的信息,員工表包含部門表的主鍵ID,則可以關聯獲取相關信息,沒必要在員工表保存相關信息。

  • 優缺點對比

范式化設計

范式化結構設計通常更新快,因為冗余數據較少,表結構輕巧,也更好的寫入內存中。但是查詢起來涉及到關聯,代價非常高,非常損耗查詢性能。

反范式化設計

所有的數據都在一張表中,避免關聯查詢,索引的有效性更高,但是數據的冗余性極高。

  • 建議結論

上述的兩種設計方式在實際開發中都是不存在的,在實際開發中都是混合使用。比如匯總統計,緩存數據,都會基于反范式化的設計。

三、字段屬性

合適的字段類型對于高性能來說非常重要,基本原則如下:簡單的類型占用資源更少;在可以正確存儲數據的情況下,選最小的數據類型。

1、數據類型選擇

  • 整數類型

TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,根據數據類型范圍合理選擇即可。

  • 實數類型

FLOAT、DOUBLE、DECIMAL,建議資金貨幣相關類型使用高精度DECIMAL存儲,或者把數據成倍擴大為整數,采用BIGINT存儲,不過處理相對麻煩。

  • 字符類型

CHAR、VARCHAR,長度不確定建議采用VARCHAR存儲,不過VARCHAR類型需要額外開銷記錄字符串長度。CHAR適合存儲短字符,或者定長字符串,例如MD5的加密結構。

  • 時間類型

DATETIME、TIMESTAMP,DATETIME保存大范圍的值,精度秒。TIMESTAMP以時間戳的格式,范圍相對較小,效率也相對較高,所以通常情況建議使用。

MySQL的字段類型有很多種,可以根據數據特性選擇合適的,這里只描述常見的幾種類型。

2、基礎用法操作

  • 數據類型

修改字段類型

ALTER TABLE ms_user_sso MODIFY state CHAR(1) DEFAULT '0' ;ALTER TABLE ms_user_sso MODIFY state INT(1) DEFAULT '1' COMMENT '狀態:0不可用,1可用';

修改名稱位置

ALTER TABLE ms_user_sso CHANGE log_ip login_ip VARCHAR(32) AFTER update_time ;
  • 索引使用

索引類型:主鍵索引,普通索引,唯一索引,組合索引,全文索引。這里演示普通索引的操作。MySQL的核心模塊,后續詳說。

添加索引

ALTER TABLE ms_user_wallet ADD INDEX user_id_index(user_id) ; CREATE INDEX state_index ON ms_user_wallet(state) ;

查看索引

SHOW INDEX FROM ms_user_wallet;

刪除索引

DROP INDEX state_index ON ms_user_wallet ;

修改索引

不具有真正意義上的修改,可以把原有的索引刪除之后,再次添加索引。

  • 外鍵關聯

用處:外鍵關聯的作用保證多個數據表的數據一致性和完整性,建表時先有主表,后有從表;刪除數據表,需要先刪從表,再刪主表。復雜場景不建議使用,實際開發中用的也不多。

添加外鍵

ALTER TABLE ms_user_wallet ADD CONSTRAINT user_id_out_key FOREIGN KEY(user_id) REFERENCES ms_user_center(id) ;

刪除外鍵

ALTER TABLE ms_user_wallet DROP FOREIGN KEY user_id_out_key ;

四、表結構管理

1、查看結構

DESC ms_user_status ; SHOW CREATE TABLE ms_user_status ;

2、字段結構

  • 添加字段
ALTER TABLE ms_user_status ADD `delete_time` datetime DEFAULT NULL COMMENT '刪除時間' ;
  • 刪除字段
ALTER TABLE ms_user_status DROP COLUMN delete_time ;

3、修改表名

ALTER TABLE ms_user_center RENAME ms_user_info ;

4、存儲引擎

  • 存儲引擎
SELECT VERSION() ; SHOW ENGINES ;

MySQL 5.6 支持的存儲引擎有InnoDB、MyISAM、Memory、Archive、CSV、BLACKHOLE等。一般默認使用InnoDB,支持事務管理。該模塊MySQL核心,后續詳解。

  • 修改引擎

數據量大的場景下,存儲引擎修改是一個難度極大的操作,容易會導致表的特性變動,引起各種后續反應,后續會詳說。

ALTER TABLE ms_user_sso ENGINE = MyISAM ;

5、修改編碼

表字符集默認使用utf8,通用,無亂碼風險,漢字3字節,英文1字節,utf8mb4是utf8的超集,有存儲4字節例如表情符號時使用。

  • 查看編碼
SHOW VARIABLES LIKE 'character%';
  • 修改編碼
ALTER TABLE ms_user_sso DEFAULT CHARACTER SET utf8mb4;

五、數據管理

1、增刪改查

添加數據

INSERT INTO ms_user_sso (user_id,sso_id,sso_code,create_time,update_time,login_ip,state ) VALUES('1','SSO7637267','SSO78631273612','2019-12-24 11:56:57','2019-12-24 11:57:01','127.0.0.1','1');

更新數據

UPDATE ms_user_sso SET user_id = '1',sso_id = 'SSO20191224',sso_code = 'SSO20191224',create_time = '2019-11-24 11:56:57',update_time = '2019-11-24 11:57:01',login_ip = '127.0.0.1',state = '1' WHERE user_id = '1';

查詢數據

一般情況下都是禁止使用 select* 操作。

SELECT user_id,sso_id,sso_code,create_time,update_time,login_ip,state FROM ms_user_sso WHERE user_id = '1';

刪除數據

DELETE FROM ms_user_sso WHERE user_id = '2' ;

不帶where條件,就是刪除全部數據。原則上不允許該操作,優化篇會詳解。TRUNCATE TABLE也是清空表數據,但是占用的資源相對較少。

2、數據安全

  • 不可逆加密

這類加密算法,多用來做數據驗證操作,比如常見的密碼驗證。

SELECT MD5('cicada')='94454b1241ad2cfbd0c44efda1b6b6ba' ; SELECT SHA('cicada')='0501746a2e4fd34e1d14015fc4d58309585edc7d'; SELECT PASSWORD('smile')='*B4FB95D86DCFC3F33A3852714DC742C77504479D' ;
  • 可逆加密

安全性要求高的系統,需要做三級等保,對數據的安全性極高,數據在存儲時必須加密入庫,取出時候需要解密,這些就需要可逆加密。

SELECT DECODE(ENCODE('123456','key_salt'),'key_salt') ; SELECT AES_DECRYPT(AES_ENCRYPT('cicada','salt123'),'salt123');

上述數據安全的管理,也可以基于應用系統的服務(代碼)層進行處理,相對專業的流程是從數據生成源頭處理,規避數據傳遞過程泄露,造成不必要的風險。

六、源代碼地址

GitHub·地址 https://github.com/cicadasmile/mysql-data-base GitEE·地址 https://gitee.com/cicadasmile/mysql-data-base

總結

以上是生活随笔為你收集整理的MySQL基础篇(02):从五个维度出发,审视表结构设计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产碰碰| 免费视频毛片 | 国产一区二区精品在线观看 | 人妻精品一区 | 亚洲涩涩涩 | 日本在线中文 | 欧美大片免费高清观看 | 亚洲成a人片77777kkkk | 嫩草视频入口 | 欧美激情视频一区二区三区不卡 | 日本少妇高潮 | 影音先锋成人在线 | 日韩www视频 | 久久久久久久久网站 | 亚洲一区二区国产 | www视频在线免费观看 | 97久久国产亚洲精品超碰热 | 国产猛男猛女超爽免费视频 | 欧美日韩在线视频免费 | 天天想你在线观看完整版电影高清 | 精品国产一区二区三区四 | 91亚洲一区 | 久久午夜网站 | 天堂va蜜桃一区二区三区 | 久久久久国产精品夜夜夜夜夜 | 四虎永久在线 | a级免费观看 | 成人免费毛片嘿嘿连载视频 | 国产大片一区二区 | 男人猛吃奶女人爽视频 | 天天操天天射天天舔 | 亚洲欧美日韩一区二区三区四区 | 天堂二区 | 黄色免费大片 | 免费美女毛片 | 久久久午夜影院 | 97精品在线观看 | 欧美天堂久久 | www.69视频 | 日韩a级一片 | 成人av影院在线观看 | 国产资源网 | 亚洲性精品 | 色综合久久久无码中文字幕波多 | 精品一区二区久久久久蜜桃 | 男女又爽又黄 | 亚洲熟妇无码爱v在线观看 九色福利 | 爱爱动态图 | 日本三级黄在线观看 | 日韩av中文字幕在线播放 | 人妖一区二区三区 | 久久精品性爱视频 | 国产美女流白浆 | 久草视频免费在线观看 | 久久精品偷拍视频 | 一区二区三区视频免费 | 亚洲AV第二区国产精品 | 超碰69 | 日韩欧美在线视频观看 | 日韩大胆人体 | 精品福利在线观看 | 奇米网久久 | 亚洲天堂2020 | 日本黄色生活片 | 亚洲国产日韩一区无码精品久久久 | 国产精品无码免费专区午夜 | 一区二区成人精品 | 夜夜春视频 | 超碰8| 自拍偷拍一区 | 色爽交| 少妇粉嫩小泬白浆流出 | 日本美女影院 | 亚洲风情第一页 | 538国产视频 | 国产成人福利视频 | 日本成人免费网站 | 毛茸茸成熟亚洲人 | 亚洲黄色免费观看 | 精品91自产拍在线观看二区 | 丁香婷婷六月 | 亚洲欧洲在线视频 | 亚洲AV无码AV吞精久久中文版 | 性欧美ⅴideo另类hd | 性高潮久久久久久 | 奇米影视第四色7777 | 国产伦一区二区三区 | 91激情视频在线 | 黄色骚视频 | 奇米影视色 | 在线观看成人小视频 | 国产精品久久久久999 | 亚洲v天堂 | 日韩中文字幕国产 | 奇米色在线| 国产一区二区三区小说 | 国产精品国语对白 | 久久婷婷色综合 | 伊人论坛 |