官术网_书友最值得收藏!

4.1 數據庫中的表

在關系數據庫中,數據表是存儲數據的基本單元,由行和列兩部分組成。它是根據數據庫設計階段的E-R圖轉換而來。在數據表中除了行、列、數據記錄、屬性、字段等基本概念外,還會涉及主鍵、外鍵、索引、約束等概念。這些概念在數據表的設計和創建的過程中會經常用到,本節就對這些概念做一個簡單的介紹。

4.1.1 數據記錄、屬性、字段、列和行

在關系數據庫中,數據表是存儲數據的基本單元,由行和列兩部分組成。其中,行用來描述實體中的具體數據,在數據表中每一行中的數據被稱為一條數據記錄,也可以簡稱為記錄;字段是表中的一列,用來保存數據表中某一條記錄中的特定信息。字段在關系數據庫中也可以稱為列。

表4.1 學生信息表

例如,在表4.1中,字段stuID用來表示學生編號,字段stuName用來表示學生的姓名,字段age用來表示學生的年齡。每一列包含了一個特定字段的全部信息,例如數據表中基于字段stuName的列就包含了學生姓名的信息,這一列中的學生姓名信息包括趙亮、王海、張明、鄭茹;學生信息表中的每一行都描述了一個學生的基本信息,例如數據表中第一行對應的數據s102203、趙亮、23就是一條數據記錄,在這條記錄中包含有學生編號、學生姓名以及學生年齡等幾個字段,它們都是用來表示學生編號為s102203學生的基本信息的。

4.1.2 主鍵

為了保證在一張數據表中不會出現兩個完全相同的數據記錄,需要為每一張數據表都定義一個主鍵。主鍵作為數據表中的唯一標示,保證了一條記錄的唯一性。通過主鍵可以區分數據表中的每一條記錄。在創建數據表時,需要保證被定義為主鍵的列的列值唯一,并且不能為空值(即NULL值)。

主鍵在關系模型中用來約束實體完整性。所謂實體完整性約束,是指對數據表中行的完整性約束。在實體完整性中,需要有一個主鍵來唯一標示數據表中每一行的數據記錄,數據表中的主鍵唯一且不能為空值。

例如,在表4.1中,學生編號字段stuID就是這張表的主鍵,每一個主鍵對應其中一名學生,在學生信息表中主鍵對應的值不能為空,更不會重復出現,也就是說不能出現兩個stuID是s102203的學生信息。

表4.2 學生成績表

當然,主鍵列并不一定就只有一列,也可以將多個列組合在一起作為表的主鍵。例如在表4.2中,有3個列,列stuID用來表示學生編號,列curID用來表示課程編號,列result用來表示學生成績。從這幾條記錄中可以看到,其中的任何一列單獨拿出來,都不可能作為主鍵唯一標示一條學生的成績信息。如果想要唯一地標示一條學生的記錄信息,需要將列stuID和列curID共同作為學生成績表的主鍵,這樣才能唯一地標示一條學生的成績信息。

注意 主鍵可以定義在多個列上,并不一定只定義在一個列上。也就是說,在定義數據表的時候,可以將數據表中的多個列合在一起作為該表的主鍵。

4.1.3 外鍵

外鍵是用來定義表與表之間的關系的。在數據表中,外鍵是這樣定義的:如果屬性列F是關系B中一個屬性(并不是關系B的主鍵),并且屬性列F是關系A中的主鍵,則F就是關系B的外鍵。關系A中的表被稱為主表,關系B中的表被稱為主表的從表。

外鍵在關系模型中用來約束參照完整性。所謂參照完整性約束,是指表與表之間的約束。在參照完整性中,從表中的每一條數據記錄中的外鍵值都必須存在于主表中。對于建立了關聯關系的兩個數據表來說,對其中一個數據表的增加、修改或者刪除數據的操作都會對另一個數據表中的記錄產生影響。

例如,在表4.1和表4.2中,列stuID和列curID兩個列聯合作為該表的主鍵。則列stuID就是學生成績表的外鍵。其中,表4.1是主表,表4.2是主表的從表。例如,如果想向學生成績表中插入一條學生成績記錄,數據庫管理系統首先會對學生信息表進行檢查,看這個學生是否在學生信息表中存在,如果存在,才會允許執行插入操作;如果該名學生在學生信息表中不存在,則執行插入操作時,數據庫管理系統會報錯,拒絕執行插入操作。

同樣,定義了外鍵約束的兩個表在數據修改和數據刪除操作時也會存在一些限制。有關定義了外鍵約束的兩個表之間進行增加、修改和刪除數據的操作,可以參看12.1.2、13.1.2和14.1.2節中介紹的內容。

4.1.4 索引

在實際應用中,為了加快訪問速度,節省訪問時間,一般都需要使用索引進行查詢。例如,在使用電話簿查詢電話時,為了減少查詢的時間,一般都會使用電話簿中提供的企業名稱作為索引來查詢;在使用一本書學習某一部分知識的時候,一般都需要翻看書后提供的索引,一般書后的索引都會以字母順序將相關的主題信息列出,通過這個索引的指引,讀者可以很快查找到想要的信息,而不需要為了查詢某一個知識點而將書中所有的內容都翻看一遍,節省了查閱的時間,也保證了學習效率。

數據庫中的索引與書后提供的索引的功能相同,在數據庫的應用中,往往一張數據表中會包含上千條甚至上萬條記錄,因此為了加快對數據表的訪問,通常需要在數據表中建立適當的索引。通過建立索引,在查詢數據表中的數據時,數據庫可以很快地將其找到,而不用掃描整個數據表。

索引是一個指向數據表中數據的指針,指向索引字段在數據表中的物理位置。如果在執行查詢操作時,WHERE子句中指定的字段是被設置為索引的字段,則數據庫會首先在索引中對指定的值進行查詢,并返回查詢的數據在數據表中的位置。如果在執行查詢操作時,WHERE子句中指定的字段沒有設置為索引的字段,那么數據庫會對查詢數據表中的每一行數據記錄進行掃描。因此適當地創建索引,可以加快數據的檢索速度,提高對數據的訪問效率,提供數據查詢的性能。

當然,索引本身也有一些弊端,例如,索引會占用大量的硬盤空間;隨著數據列的增加,創建和維護索引的時間也會隨之增加;在對數據進行增加、刪除和修改等更新操作的時候,需要對索引進行維護,降低更新數據的速度。因此,對那些不是在查詢過程中經常用到的列以及在數據表中經常需要進行增加、刪除和修改等更新操作的列就不適合建立索引。

雖然創建索引可以提高查詢的速度,但是由于索引本身會占用物理空間以及維護索引可能帶來的時間的損耗,所以在為數據表中的列創建索引時,并不是為數據表中的每一個列都要創建索引,那樣做反而不會起到提高查詢效率的作用。因此需要在數據表的適當的列上創建索引。一般可以在下面這些列中創建索引。

?在主鍵列中創建索引。

?多表連接時,在經常使用的連接列上創建索引。

?在經常使用WHERE子句查詢的列上創建索引。

?在經常進行分組(GROUP BY)和排序(OREDR BY)的列上創建索引。

4.1.5 約束

為了保證數據的完整性,需要使用數據庫約束。完整性約束包括對表的約束和對列的約束。表約束主要包括唯一約束、主鍵約束、外鍵約束和檢查約束,列約束除了包括唯一約束、參照約束和檢查約束之外,還有非空約束。

?唯一約束(UNIQUE):保證使用唯一約束的某一列或者一組列中沒有相同的值,即保證列的值的唯一性。但是唯一約束中可以允許在列中插入空值(即NULL值)。

?主鍵約束(PRIMARY KEY):保證使用主鍵約束的列中只能有唯一的值,并且不能包含空值。數據表中每一列只能定義一個PRIMARY KEY。

?外鍵約束(FOREIGN KEY):保證表的參照完整性。確保對一個表的數據操作不會對與之關聯的表造成不利的影響。

?檢查約束(CHECK):限制列的取值范圍或者取值條件。可以為一個列定義多個CHECK約束。

?非空約束(NOT NULL):只用來約束列。在向該列插入數據時不允許插入空值。

主站蜘蛛池模板: 富阳市| 牙克石市| 永康市| 扎赉特旗| 虎林市| 峨眉山市| 永丰县| 尚义县| 台湾省| 多伦县| 鄂托克前旗| 稻城县| 锦屏县| 韶关市| 安泽县| 铜山县| 巫山县| 九龙城区| 太康县| 都江堰市| 绥中县| 永州市| 新疆| 乐山市| 厦门市| 安康市| 东光县| 农安县| 丽水市| 荥经县| 晋宁县| 北碚区| 南川市| 黄浦区| 潜山县| 夏邑县| 蒙阴县| 兴城市| 阳谷县| 本溪市| 屯门区|