1970 - Codd 關聯式模型(用數學取代導航)#
案件摘要#
1970 年,IBM San Jose 實驗室的英國裔數學家 Edgar F. Codd(1923–2003) 在《ACM 通訊》(Communications of the ACM) 發表《A Relational Model of Data for Large Shared Data Banks》。 他的破案工具不是指標,而是集合論—— 把資料整理成關聯(relation,即表格)、元組(tuple,即列)、 屬性(attribute,即欄),並發明一套關聯代數:
選擇 σ(篩選列)、投影 π(挑選欄)、連接 ⋈(合併表)、 聯集 ∪——查詢變成數學式,資料路徑從程式中消失。 這是資料獨立性的徹底勝利——
前因 -- 為什麼會有這個案子#
- 計算的理論基礎(1936): 資料庫是圖靈機思想(程式 = 資料)的工程實現 (見
../資訊科學/1936-圖靈機.md)—— Codd 更進一步問:資料的操作能否也變成純數學? - 層次與網路模型的雙重死穴(1961/1969):
- IMS(見
1961-IBM層次資料庫.md):路徑綁死在樹狀結構上; - Bachman 的網路模型(見
1969-巴赫曼網路模型.md):多對多解了, 但程式仍需親自導航每一條路徑——
Codd 在 IBM 內部親眼看到:客戶的查詢程式碼比資料本身還難維護。 - Cantor 的集合論(1874): Codd 的數學武器早在 96 年前就已鍛造——
一張表格就是一個元組的集合:
數學早已準備好,只等有人把它接上資料庫。 - Codd 的出身: Codd 是數學家(密西根大學碩士),二戰時服役於皇家空軍, 1948 年移民美國加入 IBM——他不是工程師,所以他不相信「手動導航」。 1968 年他寫成內部備忘錄,1970 年改寫成震撼 CACM 的論文。
線索與推理 -- 數學式、程式、理論#
第一條線索:關聯、元組、屬性#
關聯(relation) \(R\) :元組的集合(表格); 元組(tuple) \(t\) :一列,屬性值的序列; 屬性(attribute) \(A\) :一欄的名字與定義域。
鍵(key):唯一識別元組的最小屬性集 \(K \subseteq \{A_1, \ldots, A_n\}\) :
第二條線索:關聯代數(σ、π、⋈、∪)#
選擇(selection) \(\sigma\) :篩出讓謂詞為真的元組——
投影(projection) \(\pi\) :只保留指定屬性——
自然連接(natural join) \(\bowtie\) :同屬性值相等的元組配對——
聯集(union) \(\cup\) :同結構的兩表合併——
複合查詢(例):
第三條線索:資料獨立性——用數學取代導航#
Codd 的宣言:查詢 \(\pi_{\text{name}}(\sigma_{\text{age}>30}(R))\) 不含任何指標、不含任何路徑——
對比導航式查詢:
Codd 十二法則(1985):0 法則「真正的關聯式系統」為首——
(還有 1–12:保證存取、Null 值、動態線上目錄、全面的資料子語言、 視表更新、高階插入更新刪除、實體/邏輯/完整性獨立、分散獨立等。)
Python:純 Python 關聯代數引擎(σ、π、⋈)#
# Codd 關聯代數:表格 = 列表;σ(選擇)、π(投影)、⋈(自然連接)
# 關聯 = 元組(列)的集合;屬性(欄)以字典表示
EMP = [
{"empno": 1, "name": "王大明", "age": 35, "deptno": 10},
{"empno": 2, "name": "李小華", "age": 28, "deptno": 20},
{"empno": 3, "name": "張阿財", "age": 42, "deptno": 10},
{"empno": 4, "name": "陳小美", "age": 31, "deptno": 30},
]
DEPT = [
{"deptno": 10, "dname": "研究部"},
{"deptno": 20, "dname": "業務部"},
{"deptno": 30, "dname": "人事部"},
]
def select(R, pred):
"""σ(selection):選出讓謂詞為真的元組 σ_p(R)"""
return [t for t in R if pred(t)]
def project(R, attrs):
"""π(projection):只保留指定屬性 π_A(R)"""
return [{a: t[a] for a in attrs} for t in R]
def natural_join(R, S):
"""⋈(natural join):同屬性值相等的元組配對
R ⋈ S = π_{R∪S}(σ_{R.A=S.A}(R × S))"""
common = set(R[0]) & set(S[0])
out = []
for r in R:
for s in S:
if all(r[a] == s[a] for a in common):
t = dict(r) # R 的屬性
for a in s: # + S 獨有的屬性
if a not in common:
t[a] = s[a]
out.append(t)
return out
def show(title, R):
print(title)
if not R:
print(" (空集合)")
return
attrs = list(R[0].keys())
print(" " + " | ".join(attrs))
for t in R:
print(" " + " | ".join(str(t[a]) for a in attrs))
# ---- 查詢 1:σ 選擇:年齡 > 30 的員工 ----
r1 = select(EMP, lambda t: t["age"] > 30)
show("查詢 1:σ_{age>30}(EMP) —— 選擇", r1)
# ---- 查詢 2:π 投影:只看姓名與年齡 ----
r2 = project(EMP, ["name", "age"])
show("\n查詢 2:π_{name,age}(EMP) —— 投影", r2)
# ---- 查詢 3:複合式:π_{name}(σ_{age>30}(EMP)) ----
r3 = project(r1, ["name"])
show("\n查詢 3:π_{name}(σ_{age>30}(EMP)) —— 複合查詢", r3)
# ---- 查詢 4:⋈ 自然連接:員工 × 部門 ----
r4 = natural_join(EMP, DEPT)
show("\n查詢 4:EMP ⋈ DEPT —— 自然連接", r4)
# ---- 查詢 5:完整管線:連接 + 選擇 + 投影 ----
r5 = project(select(r4, lambda t: t["deptno"] == 10), ["name", "dname"])
show("\n查詢 5:π_{name,dname}(σ_{deptno=10}(EMP ⋈ DEPT))", r5)
# ---- 資料獨立性:查詢只寫「要什麼」,不寫「怎麼走」----
print("\n資料獨立性(Codd 的宣言):")
print(" 查詢 π_{name}(σ_{age>30}(EMP)) 沒有任何指標、沒有任何路徑,")
print(" 儲存結構改變,查詢不變——數學取代了導航。")
查詢 1:σ_{age>30}(EMP) —— 選擇
empno | name | age | deptno
1 | 王大明 | 35 | 10
3 | 張阿財 | 42 | 10
4 | 陳小美 | 31 | 30
查詢 2:π_{name,age}(EMP) —— 投影
name | age
王大明 | 35
李小華 | 28
張阿財 | 42
陳小美 | 31
查詢 3:π_{name}(σ_{age>30}(EMP)) —— 複合查詢
name
王大明
張阿財
陳小美
查詢 4:EMP ⋈ DEPT —— 自然連接
empno | name | age | deptno | dname
1 | 王大明 | 35 | 10 | 研究部
2 | 李小華 | 28 | 20 | 業務部
3 | 張阿財 | 42 | 10 | 研究部
4 | 陳小美 | 31 | 30 | 人事部
查詢 5:π_{name,dname}(σ_{deptno=10}(EMP ⋈ DEPT))
name | dname
王大明 | 研究部
張阿財 | 研究部
資料獨立性(Codd 的宣言):
查詢 π_{name}(σ_{age>30}(EMP)) 沒有任何指標、沒有任何路徑,
儲存結構改變,查詢不變——數學取代了導航。
結案 -- 後果與影響#
- 1981 圖靈獎:
繼 Bachman(1973)之後,資料庫的第二位圖靈獎得主—— 數學路線的勝利。 - SQL 的理論基礎(1974): IBM 的 Chamberlin 與 Boyce 以關聯代數為基礎發明 SEQUEL(SQL)——
(見 1974-錢柏林SQL.md,稍後建立)—— 數學式變成了人人會寫的查詢語言。 - System R 與關聯式產品: IBM 的 System R(1974–1979)驗證了關聯模型可行—— Oracle(1979)、DB2(1983)、PostgreSQL(1995)、MySQL(1995)—— 關聯式統治了資料庫界五十年。 - Codd 十二法則(1985):對抗掛羊頭賣狗肉的「假關聯式」產品—— 成為關聯式系統的認證標準。 - 資料獨立性的徹底勝利:
應用程式與儲存結構徹底解耦—— 這是大型軟體系統能長期演化的關鍵。 - 歷史定位:Codd 是資料庫史的牛頓—— 他用集合論這把 96 年前的舊劍,一劍斬斷了指標的鎖鏈;
今日你寫的每一句 SELECT ... WHERE,都是 1970 年那篇論文的迴聲。
關鍵人物與文獻#
- E. F. Codd(1923–2003): A Relational Model of Data for Large Shared Data Banks(CACM, 1970); Codd 十二法則(1985);1981 圖靈獎。
- G. Cantor:集合論(1874)——Codd 的數學武器。
- D. Chamberlin、R. Boyce:SEQUEL/SQL(1974)——關聯代數的工程實現(見
1974-錢柏林SQL.md)。 - C. Bachman:網路模型(1969)——路線之爭的對手(見
1969-巴赫曼網路模型.md)。 - IBM System R 團隊:System R(1974–1979)——關聯模型的驗證。
- 相關案件:
../資訊科學/1936-圖靈機.md、1961-IBM層次資料庫.md、1969-巴赫曼網路模型.md。