跳轉到

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,即欄),並發明一套關聯代數:

\[ \boxed{\text{程式只說「要什麼」,不說「怎麼走」——數學取代導航}} \]

選擇 σ(篩選列)、投影 π(挑選欄)、連接 ⋈(合併表)、 聯集 ∪——查詢變成數學式,資料路徑從程式中消失。 這是資料獨立性的徹底勝利——

\[ \text{導航(IMS/Bachman)} \xrightarrow{\text{Codd(1970)}} \text{數學(關聯代數)}. \]

前因 -- 為什麼會有這個案子#

  • 計算的理論基礎(1936): 資料庫是圖靈機思想(程式 = 資料)的工程實現 (見 ../資訊科學/1936-圖靈機.md)—— Codd 更進一步問:資料的操作能否也變成純數學?
  • 層次與網路模型的雙重死穴(1961/1969):
  • IMS(見 1961-IBM層次資料庫.md):路徑綁死在樹狀結構上;
  • Bachman 的網路模型(見 1969-巴赫曼網路模型.md):多對多解了, 但程式仍需親自導航每一條路徑——
\[ \boxed{\text{路徑改一步,程式崩潰(邏輯資料相依)}} \]

Codd 在 IBM 內部親眼看到:客戶的查詢程式碼比資料本身還難維護。 - Cantor 的集合論(1874): Codd 的數學武器早在 96 年前就已鍛造——

\[ \text{集合 } A = \{x \mid P(x)\}, \quad \text{笛卡兒積 } A \times B. \]

一張表格就是一個元組的集合:

\[ R \subseteq D_1 \times D_2 \times \cdots \times D_n \quad\text{(} D_i \text{ 是第 } i \text{ 個屬性的定義域)} \]

數學早已準備好,只等有人把它接上資料庫。 - Codd 的出身: Codd 是數學家(密西根大學碩士),二戰時服役於皇家空軍, 1948 年移民美國加入 IBM——他不是工程師,所以他不相信「手動導航」。 1968 年他寫成內部備忘錄,1970 年改寫成震撼 CACM 的論文。

線索與推理 -- 數學式、程式、理論#

第一條線索:關聯、元組、屬性#

關聯(relation) \(R\) :元組的集合(表格); 元組(tuple) \(t\) :一列,屬性值的序列; 屬性(attribute) \(A\) :一欄的名字與定義域。

\[ R \subseteq D_{A_1} \times D_{A_2} \times \cdots \times D_{A_n}. \]

鍵(key):唯一識別元組的最小屬性集 \(K \subseteq \{A_1, \ldots, A_n\}\) :

\[ \forall\, t_1, t_2 \in R:\ t_1[K] = t_2[K] \implies t_1 = t_2. \]
\[ \boxed{\text{表格 = 元組的集合——沒有指標、沒有順序、沒有路徑}} \]

第二條線索:關聯代數(σ、π、⋈、∪)#

選擇(selection) \(\sigma\) :篩出讓謂詞為真的元組——

\[ \sigma_{p}(R) = \{\, t \in R \mid p(t) = \text{真} \,\}. \]

投影(projection) \(\pi\) :只保留指定屬性——

\[ \pi_{A_1, \ldots, A_k}(R) = \{\, t[A_1, \ldots, A_k] \mid t \in R \,\}. \]

自然連接(natural join) \(\bowtie\) :同屬性值相等的元組配對——

\[ R \bowtie S = \pi_{R \cup S}\big(\sigma_{R.A = S.A}(R \times S)\big). \]

聯集(union) \(\cup\) :同結構的兩表合併——

\[ R \cup S = \{\, t \mid t \in R \vee t \in S \,\}. \]

複合查詢(例):

\[ \boxed{\pi_{\text{name}}\big(\sigma_{\text{age} > 30}(R)\big) \quad\text{—— 年齡大於 30 的員工姓名}} \]

第三條線索:資料獨立性——用數學取代導航#

Codd 的宣言:查詢 \(\pi_{\text{name}}(\sigma_{\text{age}>30}(R))\) 不含任何指標、不含任何路徑——

\[ \text{儲存結構改變} \implies \text{查詢不變(資料獨立性)}. \]

對比導航式查詢:

\[ \underbrace{\text{FIND} \to \text{GET NEXT} \to \cdots}_{\text{導航(路徑綁死)}} \quad\xrightarrow{\text{Codd}}\quad \underbrace{\pi(\sigma(\cdots))}_{\text{數學(與路徑無關)}} \]

Codd 十二法則(1985):0 法則「真正的關聯式系統」為首——

\[ \text{法則 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 圖靈獎:
\[ \boxed{\text{Codd(1981):關聯式模型獲得最高榮譽}} \]

繼 Bachman(1973)之後,資料庫的第二位圖靈獎得主—— 數學路線的勝利。 - SQL 的理論基礎(1974): IBM 的 Chamberlin 與 Boyce 以關聯代數為基礎發明 SEQUEL(SQL)——

\[ \text{關聯代數(1970)} \xrightarrow{\text{SQL(1974)}} \text{SELECT name FROM emp WHERE age > 30} \]

(見 1974-錢柏林SQL.md,稍後建立)—— 數學式變成了人人會寫的查詢語言。 - System R 與關聯式產品: IBM 的 System R(1974–1979)驗證了關聯模型可行—— Oracle(1979)、DB2(1983)、PostgreSQL(1995)、MySQL(1995)—— 關聯式統治了資料庫界五十年。 - Codd 十二法則(1985):對抗掛羊頭賣狗肉的「假關聯式」產品—— 成為關聯式系統的認證標準。 - 資料獨立性的徹底勝利:

\[ \text{路徑綁死(1961/1969)} \xrightarrow{\text{Codd(1970)}} \text{資料獨立(邏輯/實體分離)} \]

應用程式與儲存結構徹底解耦—— 這是大型軟體系統能長期演化的關鍵。 - 歷史定位:Codd 是資料庫史的牛頓—— 他用集合論這把 96 年前的舊劍,一劍斬斷了指標的鎖鏈;

\[ \text{Cantor(1874)} \xrightarrow{\text{Codd(1970)}} \text{SQL(1974)} \xrightarrow{} \text{關聯式統治(1979–今日)}. \]

今日你寫的每一句 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。