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,28-1],有符號:[−27−1,27−1],若size=3則最大存儲數據範圍:[0,23-1]和[−22−1,22−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] |
序號 |
數據類型 |
描述 |
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位格式的年 |
序號 |
數據類型 |
描述 |
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