資料庫不是序列化工具#

  • 很常見的說法是把 RDBMS 當成記憶體物件序列化/反序列化(marshaling / unmarshaling)的解決方案;分散式運算系統也習慣把資料庫講成「儲存(storage)」的一部分。
  • 作者的觀點:談 RDBMS 與其他交易技術時,應該談的是**交易系統(transactional system)**而非儲存;「storage」這個名字留給分散式檔案系統比較貼切。

Lisp 的 print readably#

在這個題目上,Lisp 引入的 print readably 很值得一看。Lisp 不是「編譯後執行靜態二進位檔」的工作模式,而是互動式 REPL——reader 與 printer 都是系統中完整規格化、供使用者直接取用的元件。Common Lisp 標準對 printing readably 的說明:

*print-readably* 為真,列印任何物件 O1 所產生的印出表示,在標準 readtable 生效下交給 Lisp reader 讀取時,會產生一個與 O1 相似(similar)的物件 O2。

下面的範例定義一個帶有 string、float、integer 三種欄位的結構,建立實例後序列化成字串,再從字串讀回來:

(defpackage #:readably
  (:use #:cl))

(in-package #:readably)

(defstruct foo
  (name nil :type (or nil string))
  (x    0.0 :type float)
  (n    0   :type fixnum))

(defun print-and-read ()
  (let ((instance (make-foo :name "bar" :x 1.0 :n 2)))
    (values instance
            (read-from-string
             (write-to-string instance :escape t :readably t)))))

結果如預期,是一對非常相似的實例:

CL-USER> (readably::print-and-read)
#S(READABLY::FOO :NAME "bar" :X 1.0 :N 2)
#S(READABLY::FOO :NAME "bar" :X 1.0 :N 2)
  • 第一個實例由應用程式碼從字面值建立;第二個實例則由 reader 從字串重建——這個字串可以來自檔案,也可以來自網路服務。
  • Lisp 的出現遠早於關聯模型,而且 Lisp 也不是唯一能把資料結構從外部儲存讀回記憶體的語言。

要分清楚哪些問題才需要資料庫服務來解決:把值從記憶體存出去、再讀回記憶體,並不是需要動用資料庫系統的問題。