好的資料結構會影響速度。好的資料庫表設計會影響資料庫操作效率。特別是資料多的時候,如果表的結構不好的話操作的時候條件(where後的內容)會變的非常複雜。
SQL是關聯式資料庫中用到的一種語言。所以,為了簡化SQL,表的關係(內部和外部)要盡量設計的合理。
下面有幾個可以參照的步驟:
1)找出那個表要描述的東西;
2)列出你想通過這個表得到的相關資訊的列表;
3)通過上面的資訊列表,將資訊劃分成一塊塊小的部分,通過此小塊來建表;
比如說:
現在需求是:
1)我需要一個表來管理我的朋友的個人資訊;
2)我想要的是:通過名字查到某人的地址,生日和郵箱;
3)將上面的資訊劃分成一塊塊分別對應表裡的一個欄位,所以表可以如下:
姓名 住址 郵箱 生日
但需求可能更細,比如說:生日我想精確到年,這樣方便我查詢每年裡所有的朋友。這樣就可以將生日再細分成年月日三個欄位。甚至如果要細分的話,地址可以再分國國家,省,市等。當然,這就看你想通過表獲得哪些資料,一切設計是為了方便資料庫操作。在方便自己的前提下將資料表的欄位設計成“原子化”(即不可再細分)。比如說,一個網上商店的資料表,什麼路多少號對於它來說就是原子化的資料了,就不用再把什麼街多少號分開做為兩個欄位來儲存。但對於一個地產商來說,他希望可以通過街道名,號,等來查,所以地址分成幾個欄位會更好。
欄位的原子化是指一個欄位裡不要包括多個同類型的值;如:
name interests
jim fishing,football
lilei walking,book
表的原子化是指一個表裡不要包括幾個儲存同類型值的欄位;如:
teacher student1 student2 student3
lucy hanmeimei poli lily
jack rose mary simon
這裡的student1 student2 student3就重複了。但上面這兩種情況似乎只能選擇其中一個,也就是說無法滿足絕對的原子化,其實不然.我們可以把這些無法滿足原子化的欄位另外建一個表,讓兩個表關聯起來.
更合理的表設計會給每條記錄加上一個唯一的識別,就是加上主鍵。
1)將一個表欄位設為主鍵要求在表建立的時候就進行設定。
2)一個表裡被設為主鍵的欄位的值必須是唯一的,也就是說如果一個欄位被設為主鍵,這個表所有的資料列表裡這個欄位的值不可能有重複的。
3) 被設為主鍵的欄位不能插入空值。
4) 被設為主鍵的欄位的值是不能更改的。
5) 如果欄位被設為是自增長的,主鍵只能設定一個且它必須是主鍵。如果表中沒有自增長的欄位,則可以設多個欄位為主鍵.
6) 主鍵最好是一個和表裡資料無關的值。比如說另建一個欄位:id;而不要設在:name 等這些欄位上。
前面提到了兩個表關聯.兩個表之間資料的關係有三種:
1)一對一;兩個表裡資料唯一對應;
2)一對多;表A在表B裡對應多條資料,但表B裡的一條資料絕對只對就A中的一條資料;
3)多對多;A裡的一條資料對應B裡的多條資料,B裡一條資料也對應A中的多條資料.
一對一 的表設計用的不多.可能用到的情況有:
a)對一個表中大多數時候不查的欄位,放到另一個表中對應起來.這樣可以提高大多數時候查詢的效率;
b)若表中記錄還有些欄位的值未知,可以將這些欄位分出來放.這樣可以讓主表中不存在NULL;
c)不想輕易就查出來的資料,比如一個人的工資詳情,等.可以在主另一表中放著;
d)大文本,通過一個外部索引鍵關聯,這樣可以提高查詢效率;
一對多 的情況可以如下:
有一個人員資訊表info,裡麵包括一個外鍵:email;這個欄位裡存的是郵箱表emailBox裡的主鍵:id;因為一個人可以對應多個郵箱,但一個郵箱只能屬於一個人(他自己要共用木有辦法)
多對多 對最佳化表設計的用處最大,效果最顯著;一個多對多的關係是由一個串連表有兩個一對多的表關係組成的;查看下圖:
| user_id |
user_name |
| 1 |
張三 |
| 2 |
李四 |
| 3 |
王五 |
| user_id |
produc_id |
| 1 |
1 |
| 1 |
3 |
| 2 |
2 |
2
|
3
|
3
|
1
|
3
|
2
|
3
|
3
|
| produc_id |
produc_name |
| 1 |
LiNing |
| 2 |
Nike |
| 3 |
Adidas |
另外,同一個表裡的各欄位之間不要有複雜的依賴關係.各欄位只能和主鍵有依賴關係.如果非主鍵和非主鍵間有依賴關係,就要將它們從主表分離出去,放在另一個表中,並通過外鍵進行關聯