數據庫基礎系列:範式&MySQL數據格式

1 簡介

1.1 範式

範式(Normal Form, NF)是關係數據庫理論的基礎,設計數據庫結構過程中遵循的規則和指導方法.常用範式有三種,即1NF,2NF和3NF。

1.2 三種範式

序號 範式 描述
1 第一範式 列的原子性,即列爲原子性、不可再拆分的基本數據格式,如整型、浮點型、字符串、布爾型,不是這些數據類型組合形式,如數組、集合等可拆分的數據形式。
2 第二範式 滿足第一範式,包含主鍵,非主鍵列完全依賴主鍵,第二範式中的非主鍵數據都有唯一的主鍵標識,因此要求主鍵是不可重複的。
3 第三範式 第二範式的子集,第三範式避免冗餘數據,即共用的非主鍵數據,爲單獨的表,不在其他表中重複出現。

2 Usage

以MySQL關係型數據庫爲例,介紹三種範式。

2.1 MySQL數據類型

  • 字符類型
序號 數據類型 字符數 描述
1 CHAR(size) 2^8-1 存儲固定長度的字符串(字母、數字及特殊字符),size爲指定的長度,最多存儲255個字符
2 VARCHAR(size) 2^8-1 存儲可變長度的字符串(字母、數字及特殊字符),size爲指定的長度,最多存儲255個字符,若長度大於255則轉換爲TEXT類型
3 TINYTEXT 2^8-1 最多存儲255個字符
4 TEXT 2^16-1 存儲大型字符串,最多存儲65535個字符
5 MEDIUMTEXT 2^24-1 最多存儲1677215個字符
6 LONGTEXT 2^32-1 最多存儲4294967295個字符
7 BINARY 2^8-1 存儲二進制數據,而不是普通字符串,最大字符數表示存儲的字節數,存儲數據時,會在數據尾部追加0x00以保證長度爲指定長度
8 VARBINARY 2^8-1 存儲二進制數據
  • 列表類型
序號 數據類型 值個數 描述
1 ENUM(x,y,z,etc.) 65535 ENUM列表中最多可列出65535個值
2 SET 64 最多隻能包含64個列表項
  • 大容量
序號 數據類型 字節數 描述
1 BLOB 2^16-1 存儲大型二進制數據最多存儲65535字節的數據(Binary Large OBjects)
2 MEDIUMBLOB 2^24-1 最多存儲16777215字節的數據
3 LONGBLOB 2^32-1 最多存儲4294967295字節的數據
  • 數字類型
序號 數據類型 字節數 描述
1 TINYINT(size) 1 size爲存儲數據的最大位數,如1個字節,共有8位,存儲數據範圍無符號:[0,282^8-1],有符號:[271-2^7-1,2712^7-1],若size=3則最大存儲數據範圍:[0,232^3-1]和[221-2^2-1,2212^2-1]
2 SMALLINT(size) 2 存儲最大數據16位,數據範圍[0,2^16-1] [ -2^15 -1,2^15 -1]
3 MEDIUMINT(size) 3 最大存儲數據24位,數據範圍[0,2^24-1] [ -2^23 -1,2^23 -1]
4 INT(size) 4 最大存儲數據32位,數據範圍[0,2^32-1] [ -2^31 -1,2^31 -1]
5 BIGINT(size) 8 最大存儲數據64位,數據範圍[0,2^64-1] [ -2^63 -1,2^63 -1]
6 FLOAT(size,d) 4 最大存儲數據32位,數據範圍[0,2^32-1] [ -2^31 -1,2^31 -1]
7 DOUBLE(size,d) 8 最大存儲數據64位,數據範圍[0,2^64-1] [ -2^63 -1,2^63 -1]
8 DECIMAL(size,d) / 最大存儲數據65位,數據範圍[0,2^65-1] [ -2^64 -1,2^64 -1]
  • Date類型
序號 數據類型 描述
1 DATE() 日期,格式YYYY-MM-DD
2 DATETIME() 日期和時間,格式YYYY-MM-DD HH:MM:SS
3 TIMESTAMP() 時間戳,使用Unix紀元(1970-01-01 00:00:00),格式:YYYY-MM-DD HH:MM:SS
4 TIME() 時間,格式HH:MM:SS
5 YEAR() 2位或4位格式的年
  • Unicode類型
序號 數據類型 描述
1 NCHAR(size) 存儲固定長度的Unicode字符串
2 NVARCHAR(size) 存儲可變長度的Unicode字符串
3 NTEXT 存儲大型Unicode字符串
  • 位類型
序號 數據類型 描述
1 BIT(size) 存儲基於位的數據,size指定位數,存儲空間單位爲字節,計算方式:(size+7)/8個字節
2 bool 存儲邏輯值,只有兩種狀態,TRUE和FALSE,或0和1

2.2 說明

  • VARCHAR
    可變長度,存儲數據時按需分配,按字節存儲,比較節省空間,保存數據,同時記錄字符串的實際長度,因此,佔用的存儲空間大多數情況下是小於指定長度的,若插入的字符長度超過指定字符串長度,MySQL會自動截斷字符串,當被截掉的字符串不是空格時,MySQL會進行告警提示,在strict模式下,會報錯。
  • TEXT
    存儲大型字符串。
  • BLOB
    存儲大型二進制數據。
  • NCHAR
    按字符存儲數據,若存儲內容含有中文,使用nvarchar會減少出現亂碼的機率。

2.3 數據庫

以學校爲單位,設計師生相關的數據庫。

  • 學校信息表
id UUID 校名 校訓
1 0001 學校1 校訓1
2 0002 學校2 校訓2
  • 學生信息表
id UUID 姓名 年級 所屬學校
1 s001 學生1 年級1 0001
2 s002 學生2 年級2 0001
  • 教師信息表
id UUID 姓名 年級 所屬學校
1 t001 教師1 年級1 0001
2 t002 教師2 年級2 0001

2.4 範式對應關係

  • 第一範式
    每個表的列均不可再拆分爲其他自然信息。
  • 第二範式
    每個表均有主鍵id。
  • 第三範式
    學生和教師共用學校信息,因此各自表中只有學校的UUID即可,不存儲學校其他自然信息。

3 小結

範式僅作爲設計數據庫表時的一種參考,實際應用中需要按需設計,不應僅侷限於範式,MySQL中,即使不滿足第三範式,仍可運行,即,出現重複的數據仍可正常工作。


【參考文獻】
[1]https://wenku.baidu.com/view/71f1d60dbb68a98271fefa10.html
[2]https://wenku.baidu.com/view/3e445b8d48649b6648d7c1c708a1284ac950054e.html?from=search
[3]https://wenku.baidu.com/view/19c9ffe4d0f34693daef5ef7ba0d4a7302766c24.html?from=search
[4]https://blog.csdn.net/Xin_101/article/details/85247567
[5]https://www.cnblogs.com/Jashinck/p/8384388.html
[6]https://wenku.baidu.com/view/0b20617e68dc5022aaea998fcc22bcd127ff42f9.html?from=search

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章