資料庫不是序列化工具#
- 很常見的說法是把 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 也不是唯一能把資料結構從外部儲存讀回記憶體的語言。
要分清楚哪些問題才需要資料庫服務來解決:把值從記憶體存出去、再讀回記憶體,並不是需要動用資料庫系統的問題。