舉例說明一個三元關係不等於三個二元關係結合
三元關係,能同時表示三個實體在一個關係的參與情況,卻無法表示任兩個實體間單獨關係
供應商供應某零件給某項目
三個二元關係沒法同時間關聯供應商、零件、項目三者,故無法準確表達三元關係「供應」因此兩者不同
舉例說明一個三元關係不等於三個二元關係結合
三元關係,能同時表示三個實體在一個關係的參與情況,卻無法表示任兩個實體間單獨關係
供應商供應某零件給某項目
三個二元關係沒法同時間關聯供應商、零件、項目三者,故無法準確表達三元關係「供應」因此兩者不同
儲存屬性:直接存至資料庫的屬性,不由其他屬性算出,例如出生日期。
推導屬性:屬性值能由其他屬性算出,不用存入資料庫,例如年齡可由出生日期屬性算出。
1. 資料庫(Database):資料庫是一種有系統地儲存數據的集合,用於管理和存取大量資料。這些資料通常組織成表格形式,以便能夠有效地進行查詢、更新和管理操作。資料庫的目標是提供一個便於儲存和檢索的環境,適合應用於不同領域,例如商業、教育、醫療等。
2. 資料庫管理系統(Database Management System, DBMS):DBMS 是一套軟體,用於建立、管理和維護資料庫。它提供了使用者與資料庫互動的介面,讓使用者能夠方便地執行資料操作(如插入、查詢、更新和刪除資料)。DBMS 還能確保資料的一致性、安全性和完整性,並提供資料備份與恢復功能,常見的 DBMS 包括 MySQL、Oracle、Microsoft SQL Server 等
不同使用者/應用程式觀點,不同終端使用者(End User)看到資料庫不同部分的資料(有不同view)。
以資料庫管理員觀點,看到資料庫的整體性資料(基礎表格base table)。
看到資料存在資料庫之資料結構。
改資料庫系統某層綱要,不用跟著該其上層綱要,類型:
改資料庫邏輯結構(概念綱要),不用跟著改使用者/應用程式(外部綱要),如擴大資料規模。
例如:在員工資料庫增加欄位,不影響現有應用程式對資料庫查詢。
改資料實際儲存方式(內部綱要),不用跟著改資料庫邏輯結構(概念綱要),與使用者/應用程式(外部綱要),如重組某些實體檔案結構。
例子:加一個新的索引來提高效能,不影響應用程式操作。
減少應用程序的維護成本:因改資料庫的邏輯結構或物理存儲結構不影響應用程式,故能節省時間和資源。
靈活性:資料庫的設計和存儲方式可靈活變動。如,據需要優化查詢效能或存儲空間,而不影響應用程式的運行。
改進系統性能:資料庫管理員可以根據硬體和效能需求對物理存儲結構進行優化(如添加索引、調整存取方法),從而提高數據存取速度,這一切都不會影響數據庫的邏輯結構或應用程式。
簡化資料庫設計:設計者可以專注於數據的邏輯結構,而不必過度關注數據如何實際存儲。這種抽象層級的設計,使得數據模型的構建和管理更加容易和可控。
應對資料結構變更:隨著業務需求的改變,可能需要修改資料庫結構。資料獨立性允許在不影響應用層的情況下進行這些修改,從而提高了資料庫系統的可擴展性。
或稱資料庫管理系統之三層模式(三層綱要架構/three-schema architecture),由 ANSI/SPARC討論,在資料庫系統內描述描述資料的資料(schema/meta data)亦分為三層。
三層定義參考ANSI/SPARC資料庫三層架構定義。
實現資料獨立性:
邏輯資料獨立性:通過概念模式,應用程式可以在不依賴物理存儲結構的情況下正常運作,即使底層的物理結構發生改變,應用層不會受到影響。
物理資料獨立性:內部模式的改變(如文件結構或索引的優化)不會影響概念模式,這樣應用程式和使用者不需要知道資料如何具體存儲,只需關注數據的邏輯結構。
2. 提供靈活性:
三層架構允許數據在不同層次上進行獨立變更。例如,內部模式的變更不會影響概念模式或外部模式,這樣可以靈活地調整存儲結構、優化效能或應對硬體更新,而不會干擾應用層邏輯。
3. 加強數據的安全性和隱私性:
外部模式允許為不同的使用者和應用程式定義專屬的數據視圖,從而控制每個使用者能夠存取的數據範圍。這樣可以保護敏感資料,防止未經授權的存取或操作,從而增強資料庫系統的安全性。
4. 簡化資料庫的管理和維護:
通過三層架構,資料庫管理員可以專注於不同層次上的問題。例如,內部層主要關注存儲效率和資源使用,概念層則關注數據模型設計和約束條件,外部層則關注使用者需求和應用程式的整合。這樣可以簡化資料庫系統的設計、優化和管理。
表格中的主鍵須為唯一且不能為空(NULL),確保主鍵能識別表格中的每筆紀錄,避免資料重複與不一致。
表格中的外部鍵可以為空或必參考到另一個表格的主鍵,該主鍵需存在。確保表格間的關聯。避免資料不存在,如引用某個不存在的資料表。當主鍵被更新或刪除需考慮如何影響到外部鍵,如連鎖更新(cascade update)或連鎖刪除(cascade delete)
資料結構應用分治法的排序有合併/快速/堆排序,時間複雜度為O(nlogn),分治法(divide and conquer)就是將一個大問題分解為小問題,解決小問題將之合併成最終答案。以分治法考慮為何需要有完整性限制,首先沒完整性限制會遇到表格中有資料重複的問題,當你用一個屬性值取資料時,因為該屬性值重複,所以會取到多筆紀錄,你得從多筆記錄中發現那筆自己想找的記錄很花時間。如果取資料能一次就找到想找的那筆資料就好了,這時我們把表格中的一個屬性設為唯一,即該屬性沒有重複值,之後我們找資料就能用唯一的屬性一次取得想要的那筆資料了。
另一個問題是,我們用一個表格中的一個屬性關聯(關聯屬性)另一個表格的一個屬性(被關聯屬性),可以想成樂高積木的凸面與凹面,當凸面與凹面規格一致就可以組合,而兩個表格就像兩塊積木,它倆的組合面是關聯屬性與被關聯屬性,當兩屬性值一樣時就能結合在一起。如果一個關聯屬性值存在,一個被關聯屬性值不存在時,會出現一個問題,就是我找出來的那筆記錄有少資料,因為被關聯屬性值不存在,以至於無法判斷兩屬性值是否一樣,所以無法結合在一起,就如同兩塊積木規格不同而無法組合一樣。所以我們對表格加一道限制,被關聯屬性值需存在,如此就能解決無法結合的問題了。
解決了上述兩個問題,我們將解法合併為一個完整性限制,以後在設計資料表時,套用完整性限制,就能讓設計出來的資料表具完整性且沒有重複。
概念資料模型或ERD 用實體、屬性、關係描述系統資料結構關係。
概念層
據概念資料模型化為邏輯資料模型,含正規化表格與完整性限制定義
外部層
據邏輯資料模型轉具體實作,實體資料模型含實際資料庫結構(表格)及優化策略
內部層
各階段的產出為逐步將使用者需求轉成可用的資料庫結構。
階段逆序也就是說原本是階段1,2,3,改為階段3,2,1,要知道是否能逆序,首先要知道資料庫設計每個階段在做甚麼:
階段一、概念資料塑模,建立ERD 。
階段二、邏輯資料庫設計,據ERD 建邏輯資料模型,即正規化資料表與完整性限制,即SQL 定義。
階段三、實體資料庫設計,執行SQL 定義產生實體資料結構(資料表)。
有SQL 定義的執行才有實體資料結構,我們不能有實體資料結構在去生出SQL 定義,所以不能階段三後進行階段二。而進行階段二時,我們發現資料表有點問題,可能當初畫ERD 沒有考慮清楚,跳到階段一做ERD 修改。
因此我們可以得出一個新的階段順序:
階段 1<-->2 -> 3 ,其中<-->表示來回。
在階段二、三來回反覆修正SQL 定義直到正確,在執行階段三。
- 建立 Worker 表
CREATE TABLE Worker (
wID INT PRIMARY KEY, -- 工作人員編號
name VARCHAR(50) NOT NULL, -- 工作人員姓名
deptID INT NOT NULL, -- 所屬部門代號
CONSTRAINT fk_deptID FOREIGN KEY (deptID) REFERENCES Department(dID) -- 外鍵連接 Department 表的 dID
);
有助於查詢及修改限制,如沒加限制名稱系統會自動產生預設限制名稱。
如外部限制出錯,系統會回傳限制名稱有助除錯。
SELECT
CONSTRAINT_NAME,
TABLE_NAME,
COLUMN_NAME,
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
CONSTRAINT_NAME = 'fk_deptID';
ALTER TABLE Worker
DROP FOREIGN KEY fk_deptID;
ALTER TABLE Worker
DROP FOREIGN KEY fk_deptID;
ALTER TABLE Worker
ADD CONSTRAINT fk_deptID FOREIGN KEY (deptID) REFERENCES Department(dID) ON DELETE CASCADE;
-- 現在更新 Department 表,將 managerID 設為外鍵,因為 Employee 已建立
ALTER TABLE Department
ADD CONSTRAINT fk_managerID FOREIGN KEY (managerID) REFERENCES Employee(eID);