MySQL—day2

一、 修改表結(jié)構(gòu)

表結(jié)構(gòu)包含:字段名,字段類型,字段屬性

1.查看當(dāng)前表結(jié)構(gòu)

desc table_name;
image.png

2.增加字段

alter  table table_name add 字段名稱 字段類型 字段屬性 【first/after 某個(gè)字段】
image.png

添加字段的時(shí)候至少要說明字段的類型。否則的話會(huì)產(chǎn)生語(yǔ)法錯(cuò)誤。


image.png
image.png

在字段hp之前添加mp的字段

alter table hero add mp int after skill;
image.png

在數(shù)據(jù)表的最前面添加字段:

alter table hero add deface int first;
image.png

添加字段時(shí)候必須要指明添加的字段的名稱,字段類型 ,字段長(zhǎng)度。

如果沒有指定字段的位置,默認(rèn)添加的字段會(huì)添加到數(shù)據(jù)表的最后。

可以同時(shí)添加多個(gè)字段,每個(gè)字段的添加語(yǔ)句之間使用逗號(hào)隔開。

3.刪除字段

alter  table  table_name drop 字段名稱;
image.png

4.修改字段

修改表字段要分為兩種情況:

1) 修改表字段的數(shù)據(jù)類型或者屬性

alter table table_name modify 字段名稱 字段類型 字段屬性
image.png

2) 修改表字段的名稱

alter table table_name change 原字段名 新的字段名 字段類型 字段屬性
image.png

image.png

看圖說話:

不僅可以修改字段的名稱,還可以修改字段類型以及字段的屬性。

二、 MySQL數(shù)據(jù)類型

1. 數(shù)據(jù)類型的概念

不同的數(shù)據(jù)類型存儲(chǔ)的形式,存儲(chǔ)的空間,以及數(shù)據(jù)處理的效率是不一樣的。

PHP的數(shù)據(jù)類型:

標(biāo)量類型: 整型 字符串 浮點(diǎn)型 布爾型

組合類型(復(fù)雜類型):數(shù)組 對(duì)象

特殊類型:null 資源

MySQL的數(shù)據(jù)類型:

數(shù)值類型:字符串類型:日期時(shí)間類型:

image.png

2. 數(shù)值型

1) 整型

整型有五種。

tinyint :微整型(迷你整型),使用1個(gè)字節(jié)進(jìn)行存儲(chǔ)。也就是2的8次方個(gè)狀態(tài),最大表示的數(shù)據(jù)是255。

smallint:小整型。使用2個(gè)字節(jié)進(jìn)行存儲(chǔ)。最大表示65535個(gè)狀態(tài)。

mediumint:中整型。使用3個(gè)字節(jié)進(jìn)行存儲(chǔ)。

int :標(biāo)準(zhǔn)整型,使用4個(gè)字節(jié)進(jìn)行存儲(chǔ)。

bigint :大整型。使用8個(gè)字節(jié)存儲(chǔ)。

一個(gè)字節(jié)是8個(gè)二進(jìn)制位。

28種狀態(tài)。表示的數(shù)字就是2個(gè)。255。

有符號(hào)數(shù)與無符號(hào)數(shù)的區(qū)別:

0000 0001 無符號(hào)的 1

0000 0001 有符號(hào)的 +1

1111 1111 無符號(hào)的 255

 128+64+ 32+16+ 8+4+ 2+ 1 = 255

1111 1111 有符號(hào) -127

    -(  64+ 32+16+ 8+4+ 2+ 1 ) =  -127
image.png

創(chuàng)建一個(gè)整型各種類型字段的表:

create table my_int (
int_1 tinyint ,
int_2 smallint ,
int_3 mediumint ,
int_4 int ,
int_5 bigint
) charset utf8;
image.png
insert into  my_int values(1,1,1,1,1);
image.png

如果保存的數(shù)據(jù)不是整形:

insert into my_int values(1,1,1,1,’a’);
image.png

如果保存的數(shù)據(jù)超出了范圍:

insert into my_int values(255,255,255,255,255);
image.png

看圖說話:

數(shù)據(jù)庫(kù)整型數(shù)據(jù)默認(rèn)的是有符號(hào)的數(shù)據(jù)。通過desc查看表字段的信息是看不出來的


image.png

無符號(hào)的整形:

給表添加一個(gè)無符號(hào)的整形列:

alter table my_int add int_6 tinyint unsigned;
image.png

嘗試插入255的數(shù)據(jù):

insert Into  my_int values(1,1,1,1,1,255);
image.png

整形之后的數(shù)字:

image.png

添加一個(gè)新的字段:要求字段使用0填充:

比如說 :

1 2 3 10 100 1000

要修所有的數(shù)據(jù)長(zhǎng)度一致:

0001 0001 0001 0010 0100 1000

alter table my_int add int_7 int zerofill;
image.png

插入數(shù)據(jù)查看0填充效果:

insert  into  my_int (1,1,1,1,1,1,1);
image.png

2) 小數(shù)型

帶有小數(shù)點(diǎn)或者范圍超出整型的數(shù)值型的數(shù)據(jù)就是小數(shù)型的數(shù)據(jù)。

SQL中將小數(shù)型數(shù)據(jù)又分為浮點(diǎn)型與定點(diǎn)型。

浮點(diǎn)型:小數(shù)點(diǎn)會(huì)浮動(dòng),精度有限,而且有可能會(huì)丟失精度

定點(diǎn)型:小數(shù)點(diǎn)固定。精度比較高。不會(huì)丟失精度。

創(chuàng)建表:

create table my_float (
float_1 float(9,2),
float_2 decimal(9,2)
)charset utf8;
image.png

插入幾條數(shù)據(jù):

insert Into my_float values (1.23456789,1.23456789);
insert into my_float values (1234567.89,1234567.89);
insert into my_float values (1234567.23,1234567.23);
image.png

浮點(diǎn)型數(shù)據(jù):

浮點(diǎn)型數(shù)據(jù)是一種精度型數(shù)據(jù)。在超出指定的范圍之后會(huì)產(chǎn)生精度丟失,也就是四舍五入。

浮點(diǎn)型分為兩種:

float :?jiǎn)尉取J褂?個(gè)字節(jié)存儲(chǔ)數(shù)據(jù)。精度范圍大概在6位左右。

double:雙精度。使用8個(gè)的字節(jié)存儲(chǔ)數(shù)據(jù)。精度范圍是在16位左右。

float與double如果沒有指定精度的話會(huì)按照實(shí)際的精度存儲(chǔ)。

image.png

創(chuàng)建浮點(diǎn)型表:

create table you_float(
f1 float,
f2 float(10,2),
f3 float(6,2)
);
image.png

插入數(shù)據(jù):

insert into you_float values (1,2,3);
insert into you_float values (1.23456,1.23456,1.23456);
insert intp you_float values (12345678.23,12345678.23,1234.56);
image.png

看圖說話:

如果在創(chuàng)建字段的時(shí)候直接使用float創(chuàng)建,那么數(shù)據(jù)保存的時(shí)候是直接按照數(shù)據(jù)自己的精度進(jìn)行保存的。如果使用的是float(M,D )這種方式創(chuàng)建的,那么數(shù)據(jù)存儲(chǔ)的方式是小數(shù)位是D位,小數(shù)位和整數(shù)位總共是M位,整數(shù)位就是M-D為。

float類型的小數(shù)默認(rèn)的有效精度是6位,decimal有效小數(shù)位默認(rèn)是16位。

浮點(diǎn)型整數(shù)部分超出數(shù)據(jù)的指定范圍:

insert into you_float values (1234,123456789.12,1234.34);
image.png

看圖說話:

浮點(diǎn)型小數(shù)在數(shù)據(jù)保存的時(shí)候整數(shù)部分是不能夠超出范圍的。

浮點(diǎn)型小數(shù)部分超出范圍:

insert into you_float
values(123456.2345,12345678.12345,1234.34565432);
image.png

小數(shù)部分是可以超出數(shù)據(jù)范圍的,但是超出的部分要進(jìn)行四舍五入。就會(huì)產(chǎn)生數(shù)據(jù)精度的丟失。

如果是數(shù)據(jù)庫(kù)自身在四舍五入的時(shí)候產(chǎn)生進(jìn)位的情況:

insert into you_float values (99999999,99999999.99,9999.99);
insert into you_float values (99999999,99999999.999,9999.999);
image.png

如果插入最大值是自己規(guī)定的標(biāo)準(zhǔn)最大值得時(shí)候是可以進(jìn)行正常插入的,但是如果是小數(shù)進(jìn)位造成的數(shù)據(jù)進(jìn)位變成最大值,是不允許插入的。

定點(diǎn)型小數(shù):

image.png

decimal 定點(diǎn)型小數(shù),decimal他的存儲(chǔ)有效范圍適合double一樣的,但是decimal的精度是由M和D的值決定的,同時(shí)decimal的存儲(chǔ)空間也是有M決定的。也就是decimal不是占用一個(gè)固定大小空間。

decimal他的整數(shù)默認(rèn)的是10位,小時(shí)默認(rèn)的是0位,所以decimal默認(rèn)的是整形。

所以decimal的標(biāo)準(zhǔn)用法是decimal(M,D)。

float , double ,decimal都可以使用(M,D)這種方式進(jìn)行申明。但是float小數(shù)位默認(rèn)的是6位。double默認(rèn)的小數(shù)位保存的是16位。而decimal的小數(shù)位可以保存30位。

alter table you_float add f4 decimal(35,30);
image.png

如果插入的字段是大于30位的小數(shù)位:

alter table you_float add f5(35,31);
image.png

實(shí)際上,float(M,D)和double(M,D)這種格式不是浮點(diǎn)型的典型用法。而decimal(M,D)才是定點(diǎn)類型數(shù)據(jù)的標(biāo)準(zhǔn)用法,所以在使用浮點(diǎn)類型數(shù)據(jù)的時(shí)候,如果不是實(shí)際需要,盡量不要使用M,D的格式類型。如果使用了,可能會(huì)影響數(shù)據(jù)的精度。也會(huì)影響數(shù)據(jù)庫(kù)的遷移。

image.png

3. 日期與時(shí)間類型

日期格式也是數(shù)據(jù)庫(kù)常用的一種數(shù)據(jù)類型,比如說添加時(shí)間,刪除時(shí)間,下單時(shí)間。。。

image.png

1) datetime數(shù)據(jù)類型

格式:YYYY-MM-dd HH:ii::ss

b表示的范圍: 1000- 01-01 00:00:00 到 9999-12-31 23:59:59

注意:

datatime格式可以省略中間的分隔符號(hào),而且這個(gè)分隔符號(hào)也可以是任何符號(hào)。

datetime是不能省略前導(dǎo)0。

image.png

創(chuàng)建表:

create table  my_date(
t1 datetime
) charset utf8;
image.png

插入數(shù)據(jù):

insert into my_date values (‘2017-0708 12:23:32’);
insert into my_date values (‘2017-7-8 21:1:32’);
insert into my_date values (‘20110801122350’);
insert into my_date values (‘1992%05%23 23&13*12’);
image.png

image.png

所有保存進(jìn)入數(shù)據(jù)的數(shù)據(jù)會(huì)重新進(jìn)行格式化,保證數(shù)據(jù)在數(shù)據(jù)庫(kù)中是相同的格式。格式是YYYY-mm-dd HH:ii:ss.

如果插入的是一個(gè)錯(cuò)誤的時(shí)間格式:

insert into my_date  values (‘2017-13-35 12:12:12’);
image.png

如果說我希望數(shù)據(jù)插入的時(shí)間是數(shù)據(jù)進(jìn)入數(shù)據(jù)庫(kù)的當(dāng)下時(shí)間》

now():數(shù)據(jù)獲取當(dāng)前時(shí)間的函數(shù)。

insert into my_date values (now());
image.png

2) timestamp數(shù)據(jù)格式

時(shí)間戳類型也是數(shù)據(jù)的一種時(shí)間類型,這個(gè)時(shí)間戳與常規(guī)PHP時(shí)間戳是不同的,而這個(gè)類型是從格式上與datetime格式完全一致,只是在數(shù)據(jù)的存儲(chǔ)上使用4個(gè)字節(jié)的int類型存儲(chǔ)。

3) date

日期類型,相當(dāng)于datetime的日期部分。

4) year

年份,有兩種表示形式y(tǒng)ear(2)表示1970- 2069,year(4)表示1901-2155年。表示的時(shí)間范圍不一樣。默認(rèn)是year(4)的格式。

兩位

(00-69,2000--2069)

(70-99 1970--1999)

四位表示范圍:1901-2155

alter table my_date add myear year ;
image.png

5) time

時(shí)間段,指定的某個(gè)時(shí)間之間,從-時(shí)間到+時(shí)間之間的時(shí)間

alter  table my_date add mtime time;
image.png
insert into my_date values (now(),56,2);
image.png

注意:

在實(shí)際開發(fā)中,PHP具有非常強(qiáng)大的時(shí)間函數(shù)。

time():獲取當(dāng)前的時(shí)間戳;

date():格式化時(shí)間;

所以為了加快數(shù)據(jù)庫(kù)的速度,我們更多的是使用int格式來存儲(chǔ)時(shí)間戳格式的數(shù)據(jù)。

alter table my_date add timestamp1 int;

4.字符串類型

數(shù)據(jù)庫(kù)將字符串類型的數(shù)據(jù)分為六種:

char , varchar , text ,enun ,set ,blob

1) char

固定長(zhǎng)度的字符串,就是表示在數(shù)據(jù)表建表的時(shí)候就已經(jīng)吧數(shù)據(jù)長(zhǎng)度就規(guī)定好了。

char(L):L表示長(zhǎng)度,單位是字符,char類型最大的長(zhǎng)度是255。

在插入當(dāng)中》utf8編碼下。一個(gè)中文字符3個(gè)字節(jié),一個(gè)英文字符1個(gè)字節(jié)。

所以char的最大存儲(chǔ)長(zhǎng)度是255*3。

2) varchar

變長(zhǎng)字符串 ,在數(shù)據(jù)表定義的時(shí)候,指定的長(zhǎng)度是數(shù)據(jù)存儲(chǔ)的最大的長(zhǎng)度,數(shù)據(jù)開辟的空間都是按照最大的空間開辟。實(shí)際所占用的位置要按照實(shí)際存儲(chǔ)的數(shù)據(jù)的大小來決定。 varchar(L):L也表示長(zhǎng)度。表示的是在定義時(shí)所開辟的長(zhǎng)度,實(shí)際如果達(dá)不到這個(gè)長(zhǎng)度,就按照實(shí)際的漲肚存儲(chǔ)。varchar 默認(rèn)最大的長(zhǎng)度是65535個(gè)字符。注意:varchar類型除了要保存數(shù)據(jù)的實(shí)際內(nèi)容之外還需要保存數(shù)據(jù)的長(zhǎng)度,所以varchar一般會(huì)使用1-2個(gè)字符去保存數(shù)據(jù)的長(zhǎng)度。

創(chuàng)建表:

create table my_char(
num char(18),
name varchar(30)
);
image.png

插入數(shù)據(jù):

insert into my_char values('140611188809085411','ergouzi')
image.png

插入超出范圍的長(zhǎng)度

insert into my_char values('1406111888090854111','ergouzi')
image.png

image.png

如何選用變長(zhǎng)字符串還是使用定長(zhǎng)的字符串(定長(zhǎng)類型與變長(zhǎng)類型的區(qū)別):

如果在實(shí)際使用中,字符的長(zhǎng)度是固定的,那么就使用char類型,比如說身份證號(hào)碼,手機(jī)號(hào)碼,學(xué)號(hào)。

當(dāng)字符的長(zhǎng)度不確定的時(shí)候使用變長(zhǎng)類型,變長(zhǎng)類型是varchar,現(xiàn)在默認(rèn)的不用需截?cái)嘧址迦搿?/p>

為什么定長(zhǎng)類型的字段又浪費(fèi)空間的可能,還是會(huì)使用,而變長(zhǎng)字段有非常好的自動(dòng)調(diào)節(jié)能力,有的時(shí)候也不會(huì)使用?

當(dāng)時(shí)用定長(zhǎng)的時(shí)候系統(tǒng)不需要去管理數(shù)據(jù)的長(zhǎng)度開銷,系統(tǒng)的速度就會(huì)相對(duì)比較快。而那邊長(zhǎng)就相對(duì)比較慢,但是會(huì)節(jié)省空間。

注意:在實(shí)際開發(fā)過程中,如果字符串的長(zhǎng)度超過了255,一般不會(huì)使用char也不會(huì)使用varchar,而是使用text類型的數(shù)據(jù)格式。

3) 文本字符串

如果要存儲(chǔ)的字符串的長(zhǎng)度比較大就使用文本類類型的數(shù)據(jù)格式進(jìn)行存儲(chǔ)。

文本類型的數(shù)據(jù)格式按照存儲(chǔ)的數(shù)據(jù)的格式分為兩類:

存儲(chǔ)字符串格式的數(shù)據(jù)使用text類型的數(shù)據(jù)。

存儲(chǔ)二進(jìn)制格式的數(shù)據(jù)使用blob格式的數(shù)據(jù)。(通常不用)

4) 枚舉字符串

image.png

枚舉類型:非常類似于HTML 當(dāng)中的radio(單選框)

enum事先會(huì)將所有有可能使用的結(jié)果都定義好,在使用的時(shí)候只能從定義好的結(jié)果里面去選擇使用。

定義:

enum(第一個(gè)值,第二個(gè)值,第三個(gè)值。。。)

創(chuàng)建表:

create table my_set (
name varchar(30),
sex (‘男’,’女’,’就是你’)
);
image.png

image.png

當(dāng)插入的數(shù)據(jù)不是事先定義好的數(shù)據(jù)的時(shí)候會(huì)產(chǎn)生錯(cuò)誤。

使用enum的意義:

  1. 使用事先定義好的數(shù)據(jù),實(shí)現(xiàn)數(shù)據(jù)格式的固定。保證數(shù)據(jù)的規(guī)范化。

  2. 節(jié)約空間。在MySQL中eNum實(shí)際上是使用int來進(jìn)行存儲(chǔ)的。

事實(shí)上數(shù)據(jù)庫(kù)將enum的對(duì)應(yīng)關(guān)系存儲(chǔ)在數(shù)據(jù)的日志當(dāng)中,數(shù)據(jù)在進(jìn)入數(shù)據(jù)庫(kù)以及出來數(shù)據(jù)庫(kù)的時(shí)候都要進(jìn)過加工。

證明enum是使用int存儲(chǔ)的:

第一種方法:

數(shù)字+0 = 數(shù)字。我們可以使用這種機(jī)制查看enum數(shù)據(jù)。

select sex+0,sex from my_set;
image.png

第二種方法:

insert into my_set values (‘huoyuejia’,1);
image.png

5) set集合

集合與枚舉非常好相似,只不過一個(gè)是單選,一個(gè)是多選,set就是多選,相當(dāng)于HTML當(dāng)中CheckBox。

集合的數(shù)據(jù)也是以數(shù)字的形式進(jìn)行存儲(chǔ)的。

使用的時(shí)候不同的元素使用逗號(hào)進(jìn)行分割

alter table my_set add mset set('櫻桃','蘋果','香蕉','西瓜','榴蓮');
image.png
insert into my_set values ('diaozhatian','女','榴蓮,西瓜');
image.png

image.png

證明set是以數(shù)字存儲(chǔ)的:

select name,sex,mset+0 from my_set;
image.png

以數(shù)字的格式進(jìn)行set數(shù)據(jù)存儲(chǔ)。

image.png

image.png

集合中數(shù)據(jù)元素存儲(chǔ)的順序是沒有影響的。調(diào)整元素的順序不對(duì)存儲(chǔ)的數(shù)組產(chǎn)生影響。

可以很好的提高磁盤的利用率。

6) 總結(jié)

類型選擇的黃金定律:

  • 先選擇大類型,再選擇小類型

  • 具體的小類型原則:越小越好,越簡(jiǎn)單越好,不使用null最好。

四、 關(guān)系

實(shí)體:現(xiàn)實(shí)中真實(shí)存在的個(gè)體,能夠看得見,摸得著或者感受得到。實(shí)體反映到數(shù)據(jù)庫(kù)當(dāng)中相當(dāng)于數(shù)據(jù)的一條記錄。實(shí)體集相當(dāng)于數(shù)據(jù)表。實(shí)體的屬性相當(dāng)于表的字段(列)。

表與表之間具有關(guān)聯(lián),那么實(shí)體與實(shí)體之間也有關(guān)聯(lián)。實(shí)體與實(shí)體之間的關(guān)系大致分為三種:一對(duì)一的關(guān)系,一對(duì)多的關(guān)系,多對(duì)多的關(guān)系。

1. 一對(duì)一

學(xué)生表:姓名,性別,年齡,身高,體重,籍貫,住址,身份證號(hào)碼。

image.png

把不常用的信息單獨(dú)提出來作為一張表:


image.png

在主表中的任何一條數(shù)據(jù),都能在附表中找到唯一的一條數(shù)據(jù)與它對(duì)應(yīng),或者附表沒有對(duì)應(yīng)的數(shù)據(jù)。我們稱這樣的額關(guān)系為一對(duì)一的關(guān)系。

2. 一對(duì)多

表1中的一條記錄對(duì)應(yīng)表2中的多條記錄。但是反過來,表2中的一條記錄在表1中只有一條記錄與之對(duì)應(yīng)。這種關(guān)系就是一對(duì)多,或者多對(duì)一。

淘寶的賬戶表:


image.png

收貨地址表:


image.png

3. 多對(duì)多

一張表中的一個(gè)記錄可以對(duì)應(yīng)另一張表中的多個(gè)記錄,同時(shí)反過來,一條B表中的記錄也是對(duì)應(yīng)多條A表中的記錄。

老師與學(xué)生:

一個(gè)學(xué)生可以多個(gè)老師,一個(gè)老師也可以由多個(gè)學(xué)生。

老師表:

image.png

學(xué)生表:


image.png

這在種情況下,老師表想要與學(xué)生表建立聯(lián)系,第一種方式就是在老師表里面或者學(xué)生里面添加字段。但是在添加字段的時(shí)候應(yīng)該添加多少個(gè)字段?還有一種辦法就是添加一個(gè)字段,然后呢在這個(gè)字段里面堆積所有學(xué)生信息。這樣的話,在我們?nèi)?shù)據(jù)的時(shí)候,或者存數(shù)據(jù)的時(shí)候,數(shù)據(jù)處理相當(dāng)麻煩。

這種情況下我們只有去建立第三張表,第三標(biāo)保存兩個(gè)實(shí)體之間的關(guān)系:

老師學(xué)生關(guān)系表:

image.png

五、范式

normal format :是離散數(shù)學(xué)的概念。是為了解決數(shù)據(jù)的存儲(chǔ)于優(yōu)化的問題。

數(shù)據(jù)存儲(chǔ)后,能夠通過關(guān)系查找出來的數(shù)據(jù)堅(jiān)決不再進(jìn)行存儲(chǔ)。范式的目標(biāo)是為了減少數(shù)據(jù)的冗余。

范式是一種分層的結(jié)構(gòu),總共分為六層。1Nf-6NF。每一次都比上一層更加的嚴(yán)格。而且滿足下一層范式的要求必須是要符合上衣層范式的基礎(chǔ)上。

MySQL數(shù)據(jù)庫(kù)是關(guān)系型數(shù)據(jù)庫(kù)。存儲(chǔ)的數(shù)據(jù)是實(shí)體與實(shí)體關(guān)系的抽象。而范式是解決關(guān)系存儲(chǔ)過程中的數(shù)據(jù)冗余問題。從這個(gè)角度來說,范式剛好符合MySQL數(shù)據(jù)庫(kù)的設(shè)計(jì)。

但是數(shù)據(jù)庫(kù)不僅僅只是解決空間問題,還要解決效率問題,所以有的時(shí)候我們需要故意的違反范式的設(shè)計(jì)去存儲(chǔ)數(shù)據(jù)。但是范式在數(shù)據(jù)庫(kù)的設(shè)計(jì)過程中具有指導(dǎo)意義。特別是前三層。所以我們?cè)谠O(shè)計(jì)數(shù)據(jù)庫(kù)的過程中要基本滿足三層范式。

1.1NF 第一范式

在設(shè)計(jì)數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)的時(shí)候,如果數(shù)據(jù)困當(dāng)中存儲(chǔ)的某個(gè)元素,在取出來使用之前還需要再次進(jìn)行處理(比如說拆分),那么我們說這樣的數(shù)據(jù)庫(kù)關(guān)系式不符合第一范式的。

滿足第一范式的關(guān)系叫做規(guī)范化的關(guān)系,否則稱之為不規(guī)范化的關(guān)系。關(guān)系數(shù)據(jù)庫(kù)研究的都是規(guī)范化的關(guān)系。所以說數(shù)據(jù)庫(kù)設(shè)計(jì)至少要滿足第一范式。也就是數(shù)據(jù)庫(kù)表中的屬性具有原子性(不可拆分)。


image.png

如果在使用數(shù)據(jù)的時(shí)候直接拿出來出發(fā)時(shí)間與結(jié)束時(shí)間是一個(gè)整體來使用的話。整個(gè)表的設(shè)計(jì)沒有任何問題。但是如果使用的時(shí)候,開始時(shí)間與結(jié)束時(shí)間是單獨(dú)使用的,那么我們的表設(shè)計(jì)就是有問題的,需要分成兩個(gè)字段分貝進(jìn)行存儲(chǔ)。

總結(jié): 設(shè)計(jì)表結(jié)構(gòu)滿足第一范式的要求是字段要保證原子性,也就是字段不可拆分。

2.2NF 第二范式

如果數(shù)據(jù)表再設(shè)計(jì)的過程中,數(shù)據(jù)表的主鍵是組合主鍵。但是數(shù)據(jù)的唯一性不是數(shù)據(jù)的組合主鍵決定而,而是組合主鍵中的某一個(gè)字段確定的。那么我們稱這種設(shè)計(jì)為不符合第二范式的數(shù)據(jù)庫(kù)設(shè)計(jì)。數(shù)據(jù)庫(kù)字段與主鍵的依賴關(guān)系為不完全依賴。

第二范式就是首先數(shù)據(jù)庫(kù)表的設(shè)計(jì)要符合第一范式,然后數(shù)據(jù)庫(kù)的每個(gè)字段要與主鍵是完全依賴的關(guān)系(也就是數(shù)據(jù)的獨(dú)立性是所有主鍵的字段一起決定的),這種關(guān)系稱之為符合第二范式的關(guān)系。所有數(shù)據(jù)表都符合第二范式的數(shù)據(jù)庫(kù)稱之為符合第二范式的數(shù)據(jù)庫(kù)。

image.png

以上表中,教師沒辦法單獨(dú)的作為主鍵先確定帶某個(gè)班級(jí)的時(shí)間,只有在于班級(jí)一起作為主鍵(組合主鍵)才能確定班級(jí)的上課天數(shù)。但是在這張表中,教師的性別和年齡只是依賴教師ID單獨(dú)確定的。也就是說表中的字段是依賴于主鍵中的某個(gè)字段而不是主鍵所有字段。這種情況叫做部分依賴。需要重新對(duì)表進(jìn)行設(shè)計(jì),比如這里講老師的信息放在老師表中。

解決辦法:
第一種:將部分依賴的字段放在單獨(dú)的依賴表中

第二種:將組合主鍵換為邏輯主鍵,比如上面的表中再添加一個(gè)ID的字段

總結(jié):第二范式是為了消除非主鍵對(duì)主鍵的部分依賴。
只要不存在組合主鍵就不會(huì)存在部分依賴,也就是符合2NF。
如果需要這樣的主鍵去確定唯一性,我們可以設(shè)計(jì)成unique key 也就是唯一索引。

3.3NF 第三范式

要滿足第三范式必須先滿足第二范式。

理論上,一張表中所有的字段都應(yīng)該直接依賴于主鍵。也就是根據(jù)主鍵可以唯一的確定這個(gè)字段的值。但是如果在表設(shè)計(jì)的過程中,存在這樣的一個(gè)字段,他是依賴于一個(gè)非主鍵的字段而確定的,這個(gè)非主鍵是根據(jù)主鍵確定的,最終造成第一個(gè)字段依賴于主鍵確定。那么我們稱這種依賴關(guān)系為傳遞依賴。

第三范式就是要解決這種傳遞依賴的問題。

image.png

以上設(shè)計(jì)中:性別依賴于講師,講師依賴于主鍵,教室依賴于班級(jí),班級(jí)依賴于主鍵。性別和教室都是傳遞依賴。

涉及辦法:
將存在傳遞依賴的字段以及主鍵一起取出來單獨(dú)組成一個(gè)新的表。
講師表與班級(jí)表進(jìn)行拆分。

總結(jié):3范式主要解決傳遞依賴。

4.逆范式

有的時(shí)候在設(shè)計(jì)表示時(shí)候,如果數(shù)據(jù)表中的一些數(shù)據(jù)需要從另外一個(gè)數(shù)據(jù)表中根據(jù)關(guān)聯(lián)查詢?nèi)カ@取,理論上也能夠取到數(shù)據(jù)。但是效率就會(huì)低很多,所以有的時(shí)候我們?cè)谠O(shè)計(jì)數(shù)據(jù)表的時(shí)候,可以的在數(shù)據(jù)表中多增加一個(gè)字段去保存在查詢時(shí)經(jīng)常會(huì)獲取的另一個(gè)數(shù)據(jù)表中的字段。這樣在進(jìn)行數(shù)據(jù)獲取的時(shí)候使用一張數(shù)據(jù)表就能夠獲取到所有的數(shù)據(jù)。從而提高了查詢效率。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容