mysql創建表的規范

  1. 名稱

    1. 建表的時候,給表,字段和索引起個好名字
      1. 見名知意:好的名字能夠降低溝通和維護的成本
      2. 名字不宜過長,盡量控制在30個字符以內
    2. 大小寫
      1. 名字盡量都用小寫字母,因為從視覺上,小寫字母更容易讓人讀懂
      2. 全部大寫,看起來不太直觀,一部分大寫一部分小寫更不可以
    3. 分隔符
      1. 單詞之間沒有分隔,或者單詞間用駝峰標識,或者單詞間用空格分隔,或者單詞間用@分隔,都不建議
      2. 建議在單詞之間使用下橫線_分隔
    4. 表名
      1. 對于表名,在言簡意賅,見名知意的基礎上,建議帶上業務前綴
      2. 如果是訂單相關的業務表,可以在表名前面加個前綴:order_,比如order_pay
      3. 這樣做的好處是為了方便歸類,把相同業務的表,可以非常快速的聚集在一起
      4. 如果哪天有非訂單的業務,比如:金融業務,也需要建一個名字叫做pay的表,可以取名:finance_pay,就能非常輕松的區分,這樣就不會出現同名表的情況
    5. 字段名稱
      1. 比如有些表用flag表示狀態,而有些表使用status表示狀態,可以統一一下,使用status表示狀態
      2. 如果一個表使用了另一個表的主鍵,可以在另一張表的名后面,加_id,例如:product_spu_id
      3. 創建時間,可以統一為:create_time,修改時間統一為:update_time
      4. 刪除狀態固定位:delete_status
      5. 還有很多公共字段,在不同表之間,可以使用全局統一的命名規則,定義成相同的名稱,以便大家好理解
    6. 索引名
      1. 普通索引和聯合索引,其實是一類,在建立該類索引時,可以加ix_前綴,比如:ix_product_status
      2. 唯一索引,可以加ux_前綴,比如:ux_product_code
  2. 字段類型

    1. 時間格式的數據有:date,datetime,timestamp等可以選擇
    2. 字符類型的數據有:varchar,char,text等可以選擇
    3. 數字類型數據有:int,bigint,smallint,tinyint等可以選擇
    4. 如果字段類型選大了,比如原本只有1-10之間的10個數字,結果選了bigint,他占了8個字節,其實1-10之間的10個數字,每個數字1個字節就能保存,選擇tinyint更為合適,這樣會白白浪費7個字節的空間
    5. 如果字段類型選小了,比如:一個18位的id字段,選擇了int類型,最終數據會保存失敗
    6. 所以選擇一個合適的字段類型,是很重要的
    7. 參考原則:
      1. 盡可能選擇占用存儲空間小的字段類型,在滿足正常業務需求的情況下,從小到大,往上選
      2. 如果字符串長度固定,或者差別不大,可以選擇char類型,如果字符串長度差別較大,可以選擇varchar類型
      3. 是否字段,可以選擇bit類型
      4. 枚舉字段:可以選擇tinyint字段
      5. 主鍵字段:可以選擇bigint類型
      6. 金額字段:可以選擇decimal類型
      7. 時間字段:可以選擇timestamp或datetime類型
  3. 字段長度

    1. 在mysql中除了varchar和char是代表字符長度外,其余類型都是代表字節長度
    2. bigint(4),bigint實際長度為8個字節,現在有一個數據a=1.a顯示4個字節,所以在不滿足4個字節時前面填充0(前提是該字段設置了zerofill屬性),比如:0001,當滿了4個字節時,比如現在數據是a=123456,他會按照實際的長度顯示,比如123456,但需要注意的是,有些mysql客戶端即使滿了4個字節,也只能顯示4個字節的內容,比如會顯示成:1234,所以bigint(4),這里的4表示顯示的長度為4個字節,實際長度還是占8個字節
  4. 字段個數

    1. 建表時需要對字段的個數做一定的限制
    2. 如果表的字段個數非常多,可以將一張大表拆分成多張小表,這幾張表的主鍵相同
    3. 建議每表的字段個數,不超過20個
  5. 主鍵

    1. 在創建表時,一定要創建主鍵,因為主鍵自帶了主鍵索引,相比于其他索引,主鍵索引的查詢效率更高,因為他不需要回表
    2. 主鍵還是天然的唯一索引,可以根據他來判重
    3. 在單個數據庫中,主鍵可以通過auto_increment,設置為自動增長的
    4. 但在分布式數據庫中,特別是做了分庫分表的業務庫中,主鍵最好由外部算法(比如:雪花算法)生成,他能夠保證生成的id是全局唯一的
    5. 主鍵建議保存跟業務無關的值,減少業務耦合性,方便今后的擴展
    6. 不過也有一些一對一的表關系,比如:用戶表和用戶擴展表,在保存數據時是一對一的關系,這樣用戶擴展表的主鍵,可以直接保存用戶表的主鍵
  6. 存儲引擎

    1. 在mysql8之前的版本,默認的存儲引擎是myisam,而mysql8以后的版本,默認的存儲引擎是innodb
    2. myisam的索引和數據分開存儲,有利用查詢,但他不支持事務和外鍵等功能
    3. innodb雖然查詢性能稍微弱一點,但他支持事務和外鍵等,功能更強大一些
    4. 以前的建議是:讀多寫少的表,用myisam存儲引擎,而寫多讀多的表,用innodb
    5. 但隨著mysql對innodb存儲引擎性能的不斷優化,現在myisam和innodb查詢性能相差已經越來越小
    6. 所以在使用mysql8之后的版本時,直接使用默認的innodb存儲引擎即可,無需額外修改存儲引擎
  7. not null

    1. 定義字段時,應該盡可能明確字段為NOT NULL
      1. 在innodb中,需要額外的空間存儲null值,需要占用更多的空間
      2. null值可能會導致索引失效
      3. null值只能用is null或者is not null判斷,用=號判斷永遠返回false
    2. 因此,建議定義字段時,能定義為not null,就定義為not null
    3. 如果某個字段直接定義成not null,萬一有些地方忘了給該字段寫值,就會insert不了數據
    4. alter table product_sku add column brand_id int(10) not null default 0;
  8. 外鍵

    1. 在mysql中,是存在外鍵的
    2. 外鍵存在的主要作用是:保證數據的一致性和完整性
    3. foreign key(cid) references class(id),student表的cid字段,保存的class表的id,這時通過foreign key增加了一個外鍵
    4. 如果直接通過student表的id刪除數據,會報異常:a foreign key constraint fails
    5. 必須先刪除class表對應的cid那條數據,再刪除student表的數據才行,這樣能夠保證數據的一致性和完整性
    6. 只有存儲引擎是innodb時,才能使用外鍵
    7. 一般不建議使用外鍵,因為這類系統更多的是為了性能考慮,寧可犧牲一點數據一致性和完整性
    8. 除了外鍵之外,存儲過程和觸發器也不建議使用,會影響性能
  9. 索引

    1. 在建表時,除了指定主鍵索引外,還需要創建一些普通索引
    2. id int(10) primary key auto_increment
    3. 普通索引:key ‘ix_spu_id’ (‘spu_id’) using btree
    4. 后面查詢表的時候,效率更高
    5. 但索引字段也不能建的太多,可能會影響保存數據的效率,因為索引需要額外的存儲空間
    6. 建議單表的索引個數不要超過5個
    7. 如果在建表時,發現索引個數超過5個了,可以刪除部分普通索引,改成聯合索引
    8. 在創建聯合索引時,需要注意最左匹配原則,不然,建的聯合索引效率可能不高
    9. 對于數據重復率非常高的字段,比如:狀態,不建議單獨創建普通索引,因為即使加了索引,如果mysql發現全表掃描效率更高,可能會導致索引失效
  10. 時間字段

    1. 時間字段的類型,目前mysql支持:date,datetime,timestamp,varchar等
    2. varchar類型可能是為了跟接口保持一致,接口中的時間類型為String
    3. 但是如果需要通過時間范圍查詢數據,效率會非常低,因為這種情況沒法走索引
    4. date類型主要為了保存日期,比如:2024-07-02,不適合保存日期和時間,比如:2024-07-02 21:05:30
    5. 而datetime和timestamp類型更適合保存日期和時間
    6. timestamp:用4個字節來保存數據,他的取值范圍為1970-01-01 00:00:00UTC - 2038-01-19 03:14:07,此外,還跟時區有關
    7. datetime:用8個字節保存數據,他的取值范圍為:1000-01-01 00:00:00 - 9999-12-31 23:59:59,他和時區無關
    8. 優先推薦使用datetime類型保存時間和日期,可以保存的時間范圍更大
    9. 在給時間字段設置默認值時,建議不要設置成:0000-00-00 00:00:00 不然查詢表時可能會轉換不了直接報錯
  11. 金額字段

    1. mysql中有多個字段可以表示浮點數:float,double,decimal等
    2. float和double可能會丟失精度,因此推薦使用decimal類型保存金額
    3. 一般這樣定義浮點數:decimal(m,n)
    4. 其中的n是指小數的長度,而m是指整數加小數的總長度
    5. 比如:decimal(10,2),則表示整數長度為8,并且保留2位小數
  12. JSON字段

    1. 某個字段保存的數據值不固定
    2. mysql支持按字段,查詢json中的數據
  13. 唯一索引

    1. 可以給單個字段,加唯一索引
    2. 也可以給多個字段,加一個聯合的唯一索引,聯合的唯一索引,字段值出現null時,則唯一性約束可能會失效
    3. 創建唯一索引時,相關字段一定不能包含null值,否則唯一性會失效
  14. 字符集

    1. mysql支持的字符集有很多:latin1,utf-8,utf8mb4,GBK
    2. GBK:長度2,支持中文,但是不是國際通用的字符集
    3. UTF-8:長度3位,支持中英文混合場景,是國際通用字符集
    4. latin1:長度1位,mysql默認的字符集
    5. utf8mb4:長度4位,完全兼容UTF-8,用四個字節存儲更多的字符
    6. latin1容易出現亂碼問題,子啊實際項目中使用比較少
    7. 而GBK支持中文,但不支持國際通用字符,在實際項目中使用也不多
    8. 目前,mysql的字符集使用最多的還是utf-8和utf8mb4
    9. 其中utf-8占用3個字節,比utf8mb4的4個字節,占用更小的存儲空間
    10. 但UTF-8有個問題:無法存儲emoji表情,因為emoji表情需要4個字節,保存時會直接報錯
    11. 建議在建表時字符集設置成:utf8mb4,會省去很多不必要的麻煩
  15. 排序規則

    1. 在mysql中創建表時,有個collate參數可以設置排序規則
    2. collate=utf8mb4_bin
    3. 字符排序規則跟字符集有關,比如字符集如果是utf8mb4,則字符排序規則也是以utf8mb4_開頭的,常用的有:utf8mb4_general_ci,utf8mb4_bin等
    4. 其中utf8mb4_general_ci排序規則,對字母的大小寫不敏感,不區分大小寫
    5. 而utf8mb4_bin排序規則,對字符大小寫敏感,區分大小寫
    6. 比如:order表中有一條記錄,name的值是大寫的YOYO,但我們用小寫的yoyo去查,select * from order where name = ‘yoyo’;
    7. 如果字符排序規則是utf8mb4_general_ci,則可以查出大寫的YOYO的數據
    8. 如果字符排序規則是utf8mb4_bin,則查不出來
    9. 因此,字符排序規則,要根據實際的業務場景選擇,否則容易出現問題
  16. 大字段

    1. 大字段,即占用較多存儲空間的字段,比如用戶評論
    2. 如果直接定義為text類型,可能會浪費存儲空間,所以建議講這類字段定義為varchar類型的存儲效率更高
    3. 如果是合同數據,一個合同可能會占幾MB,可以保存到mongodb中,然后在mysql的業務表中,保存mongodb表的id
  17. 冗余字段

    1. 在設計表的時候,為了性能考慮,提升查詢速度,有時可以冗余一些字段
    2. 對查詢性能有利,但需要額外的存儲空間,還可能會有數據不一致的情況,比如用戶名稱修改了
    3. 我們在實際業務場景中,需要總和評估,冗余字段方案不適用于所有的業務場景
  18. 注釋

    1. 在做表的設計時,一定要把表和相關字段的注釋加好,并且經常需要更新這些注釋

    2. ‘valid_status’ tinyint(1) not null default 1 comment ‘有效狀態 1:有效 0 :無效’

    3. 特別是有些狀態類型的字段,比如valid_status字段,該字段表示有效狀態,1:有效,0:無效,

    4. 讓人可以一目了然,表和字段是干什么用的,字段的值可能有哪些

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/39460.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39460.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/39460.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux嵌入式中MQTT的使用

MQTT是什么? MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),是一種基于發布/訂閱(Publish/Subscribe)模式的輕量級通訊協議,該協議構建于TCP/IP協議上&#xff0…

駕馭npm更新之力:深入掌握npm update命令的精髓

駕馭npm更新之力:深入掌握npm update命令的精髓 在JavaScript和Node.js的世界中,npm(Node Package Manager)作為默認的包管理器,扮演著至關重要的角色。它不僅用于安裝和管理項目依賴,還提供了更新這些依賴…

SpringBoot3.3集成knif4j-swagger文檔方式和使用案例

springboot3 集成 knif4j &#xff1a; 訪問地址&#xff1a; swagger 接口文檔默認地址&#xff1a;http://localhost:8080/swagger-ui.html# Knife4j 接口文檔默認地址&#xff1a;http://127.0.0.1:8080/doc.html Maven: <dependency><groupId>com.github.x…

2024 COMMUNITY DAY User Group 社區嘉年華 云計算與 AI 技術交融盛會共筑多元智慧未來

亞馬遜云科技User Group&#xff0c;深圳 Community Day 活動流程搶先知道&#xff01; ? 7月7日 &#x1f3e0; 深圳南山區香港中文大學 &#x1f4e3;主論壇國際大咖云集&#xff0c;共襄科技盛宴&#xff01; &#x1f389;三大主題論壇&#xff1a;人工智能、大數據、動…

MyBatis系列三: XxxMapper.xml-SQL映射文件

XxxMapper.xml-SQL映射文件 官方文檔基本介紹詳細說明基本使用parameterType(輸入參數類型)傳入HashMapresultMap(結果集映射) 官方文檔 文檔地址: https://mybatis.org/mybatis-3/zh_CN/sqlmap-xml.html 基本介紹 1.MyBatis的真正強大在于它的語句映射(在XxxMapper.xml配置…

2024年06月CCF-GESP編程能力等級認證Python編程一級真題解析

本文收錄于專欄《Python等級認證CCF-GESP真題解析》,專欄總目錄:點這里,訂閱后可閱讀專欄內所有文章。 一、單選題(每題 2 分,共 30 分) 第 1 題 小楊父母帶他到某培訓機構給他報名參加CCF組織的GESP認證考試的第1級,那他可以選擇的認證語言有幾種?( ) A. 1 B. 2 C…

React@16.x(45)路由v5.x(10)源碼(2)- history

目錄 1&#xff0c;作用1.1&#xff0c;createBrowserHistory1.2&#xff0c;createHashHistory1.3&#xff0c;createMemoryHistory 2&#xff0c;history 對象的屬性2.1&#xff0c;action2.2&#xff0c;push / replace / go / goBack / goForward2.3&#xff0c;location2.…

網絡配線架的隱藏功能

網絡布線是確保現代信息社會高效運轉的關鍵技術之一。在這一領域&#xff0c;網絡配線架扮演著至關重要 的角色。它不僅僅是一個簡單的物理連接點&#xff0c;更擁有許多隱藏功能&#xff0c;這些功能極大地提升了網絡的 效率、穩定性和可管理性。 1、集中管理 網絡配線架提…

【BES2500x系列 -- RTX5操作系統】深入探索CMSIS-RTOS RTX -- 同步與通信篇 -- 消息隊列和郵箱處理 --(四)

&#x1f48c; 所屬專欄&#xff1a;【BES2500x系列】 &#x1f600; 作??者&#xff1a;我是夜闌的狗&#x1f436; &#x1f680; 個人簡介&#xff1a;一個正在努力學技術的CV工程師&#xff0c;專注基礎和實戰分享 &#xff0c;歡迎咨詢&#xff01; &#x1f49…

經典FC游戲web模擬器--EmulatorJS

簡介 EmulatorJS是一個基于JavaScript和Webassembly技術的虛擬環境的實現&#xff0c;可以在網頁中運行各種經典FC游戲系統&#xff0c;支持任天堂、世嘉、雅達利等經典紅白機。EmulatorJS的誕生使得諸如超級瑪麗、坦克大戰、魂斗羅等經典FC游戲能夠以一種全新的方式回歸。本文…

SAP MM模塊的ATP檢查

前面幾篇文章都演示和說明ATP的一些設置和操作&#xff0c;通常情況下ATP的檢查PP模塊&#xff0c;SD模塊用的相對來說是比較多的&#xff0c;但是實際上MM模塊也會遵循ATP的可用性的檢查規則。 當我們在做311、301等移動類型時&#xff0c;系統會根據相應的可用性檢查規則&am…

Linux常用指令匯總

Linux常用指令匯總 Cfilt 功能&#xff1a;解析C程序中被修飾的符號&#xff0c;比如變量與函數名稱。 示例&#xff1a; 解析編譯器 g 修飾的函數名稱。 cfilt -s gnu-v3 _Z5printRKSs print(std::basic_string<char, std::char_traits<char>, std::allocator<…

Django 多對多關系

多對多關系作用 Django 中&#xff0c;多對多關系模型的作用主要是為了表示兩個模型之間的多對多關系。具體來說&#xff0c;多對多關系允許一個模型的實例與另一個模型的多個實例相關聯&#xff0c;反之亦然。這在很多實際應用場景中非常有用&#xff0c;比如&#xff1a; 博…

【每日一個Git命令: cherry-pick】

git cherry-pick 命令的作用是將指定的提交&#xff08;commit&#xff09;應用到其他分支上。這個命令允許你選擇一個或多個已有的提交&#xff0c;并將它們作為新的提交引入到當前分支中。 這個過程不會改變項目的歷史記錄&#xff0c;因為它實際上是創建了這些提交的副本。…

BMA530 運動傳感器

型號簡介 BMA530是博世&#xff08;bosch-sensortec&#xff09;的一款運動傳感器。時尚簡約的可穿戴設備為功能強大的組件提供了很小的空間。具有先進功能集的下一代加速度計是世界上最小的加速度傳感器&#xff08;1.2 x 0.8 x 0.55 mm&#xff09;。它專為緊湊型設備而設計&…

24/07/02數據結構(1.1201)算法效率順序表

數據結構基本內容:1.時間復雜度 空間復雜度2.順序表鏈表3.棧 隊列4.二叉樹5.排序 數據結構是存儲,組織數據的方式.指相互之間存在一種或多種特定關系的數據元素的集合 算法是定義良好的計算過程.取一個或一組值為輸入并產生一個或一組值為輸出. 需要知道雖然選擇題有20-30個…

Leetcode1114 交替打印 FooBar及其測試

題目描述 相關標簽 相關企業 給你一個類&#xff1a; class FooBar { public void foo() { for (int i 0; i < n; i) { print(“foo”); } } public void bar() { for (int i 0; i < n; i) { print(“bar”); } } } 兩個不同的線程將會共用一個 FooBar 實例&#xf…

python自動化運維--DNS處理模塊dnspython

1.dnspython介紹 dnspython是Pyhton實現的一個DNS工具包&#xff0c;他幾乎支持所有的記錄類型&#xff0c;可以用于查詢、傳輸并動態更新ZONE信息&#xff0c;同事支持TSIG&#xff08;事物簽名&#xff09;驗證消息和EDNS0&#xff08;擴展DNS&#xff09;。在系統管理方面&a…

Linux高并發服務器開發(九)Tcp狀態轉移和IO多路復用

文章目錄 0 包裹函數1 多進程服務器流程代碼 2 多線程服務器3 TCP狀態轉移半關閉心跳包 4 端口復用5 IO多路復用技術高并發服務器 6 select代碼總結 7 POLLAPI代碼poll相對select的優缺點 8 epoll&#xff08;重點&#xff09;API監聽管道代碼EPOLL 高并發服務器 9 Epoll的兩種…

Iot解決方案開發的體系結構模式和技術

前言 Foreword 計算機技術起源于20世紀40年代&#xff0c;最初專注于數學問題的基本原理&#xff1b;到了60年代和70年代&#xff0c;它以符號系統為中心&#xff0c;該領域首先開始面臨復雜性問題&#xff1b;到80年代&#xff0c;隨著個人計算的興起和人機交互的問題&#x…