表格、欄、列 |
表格
- 持有資料的資料庫結構
- 包含特定實體類型的資料
- 是一個具有列與欄特性的二維方陣
- 每個列 - 欄文會的位置都有一個稱為數值的資料項目
- 欄位數目至少為 1 , 列的數目沒有限制
- 在資料庫中有獨特的名稱 (或者嚴格的說是一種綱要schema)
欄
- 每一欄都代表了表格實體類型的特定屬性(或特性)
-
個欄的數值都有值域 , 它限定該欄中所能允許的數值集合 ,
(值域..資料型態、長度、格式、範圍、獨特性、特定數值、數值是否可為空值)
- 欄位中的項目都是單一數值
- 欄位的順序並不重要
- 表格中的每欄都有可供辨識的獨特名稱 (其他表格可以使用相同的欄位名稱 辨識的方式就是 table.欄位名稱 )
列
- 每一列都描逑了一個實體的真相 , 例如特殊的學生或設備
- 在每個表格欄位,中每一列都含有一個數值或是空值
- 列的順序 (由下至上)並不重要
- 表格中不能有完全相同的列
- 表格中的每一列都是由主索引鍵來識別
-
DBMS使用兩種類型的表格
- 1.使用者表格(User table):儲存了使用者定義的資料
- 2.系統表格(System table):包含了資料格式(metadata)
-
實際上,表格中的列的數目是不斷在改變,但欄的數目卻少有改變。資料庫的複雜程度會讓新增或刪除欄位的困難的增加 ;
欄的變更可能會影響到索引鍵、參考完整性與權限等項目。然而新增增或刪除列並不影響。
-
資料庫設計時可能根據使用者需求將數值劃分為許多欄。舉電話號碼來說可能存為單一欄位tel_no , 或是劃分為country_code
、 area_code 、 與subscriber_number來組成一個電話號碼。
-
試算表與表格間並沒有什麼相似之處。和試算表不同的是 , 表格中的列與欄的順序對它而言並無影響、不進行計算,也不允許不規則的資料
項目,並強烈要求每個數值的合法性,而且可以輕易的與其他表格建立關聯。
-
SQL標淮對關聯式資料庫的結構定義了階層。一個目錄(catalog)中含有一個以上的綱要(schema)(由特定使用者擁有的物件及資料的集合)。一個
綱要中含有一個以上的物件 (objdct)(基本表格、檢視表(view)與列行工作[函式/程序]
主索引鍵
-
資料庫中每個數值都必須可以被存取 , 資料被儲存在表格中列與欄交集的位置 , 因此 , 一個數值的位置必須與特定的表格、
欄列相關。利用它的獨特名稱便可以辨別表格或欄。然而列並沒有被命名 , 它需要一個稱為主索引鍵的不同辨識機制
- 必須的:每個表格都具有一個主索引鍵。如果沒有主索引鍵,有些資料便無法存取。
- 獨特的:因為主索引鍵是用來辨別表格中的特定列,因此表格中的任二列不得擁有相同的主索引鍵值
-
簡單或複合:
- 簡單索引鍵:在一個表格使用一個欄位做索引鍵
- 複合索引鍵:在一個表格中使用多個欄位做索引鍵
- 不能為空值:主索引鍵必須要有值。複合索引鍵中所有欄都必須要有值
- 不常變動的:一旦被建立後 , 主索引鍵值就很少被修改
- 最小化的:主索引鍵值只含有用來識別所需的最少欄位
外部索引鍵
-
與不同實體相關的資訊被儲存在不同的表格中 , 因此必須要有
個能夠在表格間查詢的方法。關聯式模型提供了一個稱為外部索引鍵的機制將表格聯繫在一起
- 它是表格中的一個 (或一組)欄 , 而它的數值與其他表格中的數值有關
- 它確保表格中的某一列能夠在另一個表格中找到相對應的列
- 具有外部索引鍵的表格是一個參照(referencing)或子表格。而其他表格敗為被參照(referenced)或父表格。
-
外部索引鍵與父表格的主索引鍵(或其他候選索引鍵)建立了直接的關聯 , 因此外部索引鍵的值被限制在現有的父索引鍵的值。
這個這個限制稱為參考性完整
- 外部索引鍵具有與父索引鍵相同的值域
- 和主索引鍵不同的是 , 外部索引鍵的值可以是空值
- 外部索引鍵的欄位名可以與父索引鍵的欄位名稱不同
- 外部索引鍵的數值在它們的表格上通常不是唯一的
- 外部索引鍵可以參考它所屬的表格的主索引鍵。這類的表格稱為自我參照
關聯性
-
一對一
-
在一對一中 , A表格中的每一列最多只能對應到B表格中的一個列;而B表格中的每一列最多只能對應到
A表格中的一個列。
- 這樣的做法的理由可能基於安全性考量而將機密資料分離、將表格分離以加速查詢、避免在表格中插入空值。
- 一個表格的主索引鍵參考到其他表格的主索引鍵就是一對一了...
-
一對多
- 在一對多中 , A表格中的每一列在B表格中可以有多個對應列 , 在B表格中的每一列在A表中只有一個對應列
- 當一個表格的主索引鍵是多個表格的外部索引鍵時 , 便建立一對多關聯性
-
多對多
- 在多對多關聯性下 , A表每一列可以對應B表格的多個 , 而B表格每一列亦可以對應A表格中的多個列
- 多對多只有當稱為聯合表格(junction table)的第三個表格被創造時才會被建立
-
聯合表格的複合主索引鍵是由兩個表格的主索引鍵所組成 ; 複合索引鍵中的每一欄位 , 在單獨使用時便是外部索引鍵。
此種技術對聯合表格中的每一列產生唯一的數值 , 並將多對多關聯性分離成兩個獨立的一對多關聯聯性
正規化
-
第一正規化
-
違反第一正規化的問題
- 在列欄交集的位置含有多個數值,這表示表格名稱、欄位名稱、興索引鍵值的組合還不足以找出資料庫中的任意數值。
- 要取得、插入、修改或刪除單一數值(在多個數值中)是很困難的,因為必須欄據這些數值的順序來操作
- 查詢動作很複雜
- 原本由下一級正規化所能解決的問題會變得無法解決
-
第二正規化
- 它的主索引鍵是單一欄位(它並不是複合索引鍵)
- 表格中所有欄位都是主索引鍵的一部分
-
滿足2NF的表格是完全功能相依
完全功能相依:當任何複合索引鍵值改變時,非索引鍵欄位的數值也需要修改。
部分功能相依:當某些複合索引鍵的值決定了非索引鍵欄位的數值。
-
一個滿足2NF的表格是完全功能相依關係(fully functional dependent) , 這表示當任何複合索引鍵值改變時 , 非索引
鍵欄位的數值也需要修改
-
第三正規化
-
不具遞移相依性(transitive dependency),在3NF的表格中,非索引鍵的欄位互不相關,只和主索引鍵相關
遞移相依性:非索引鍵的數值決定了另一個非索引鍵欄位的數值時
反正規化
- 正規化越多,表格數目越多-->耗費大量計算能力的合併動作以及磁碟機讀寫動作
- 一個反正規化的資料庫通常比正規化的資料庫還難理解
- 在查詢時的速度較快,但是修改時的速度較慢
- 插入不一致資料的風險增加
|
暫存表
|
'************************ 建立暫存表格只需使用#指令 , 在ACCESS不支援暫存表格
sql = "CREATE TABLE #HotelTemp(SID numeric,ename ntext,ewkind ntext,ehkind ntext,etinfo ntext,star ntext,imgh ntext,ehinfo ntext,imgMapEA ntext,imgMapEB ntext,imgMapEC ntext)"
conn_Kwell.Execute(sql)
For i = 1 to 300
Nttext = Nttext+"I"
Next
Sqlinsert = "Insert into #HotelTemp(SID,ename,ewkind,ehkind,etinfo,star,imgh,ehinfo,imgMapEA,imgMapEB,imgMapEC) Values('1','"&Nttext&"','33','44','55','66','77','88','99','100','111')"
conn_Kwell.execute(Sqlinsert)
'************************ TEMP TEST
Set rsTemp = Server.CreateObject("ADODB.RecordSet")
SQLSelect = "Select * from #HotelTemp"
rsTemp.open SQLSelect,conn_KWELL,1,1
while not rsTemp.eof
Response.write rsTemp("ename")&" "
rsTemp.MoveNext
wend
Response.write Nttext
Set conn_Kwell = nothing
|