Postgresql

通過將數據保存為 BLOB 來線上 ALTER TABLE

  • March 23, 2017

你能解釋一下如何extreme de-normalization (store the value as a serialized blob幫助線上更改表嗎?資源

此外,能夠更改架構至關重要:要麼使用可以線上完成 ALTER TABLE 的數據庫,解決數據庫的限制並建構一種非破壞性執行 ALTER TABLE 的方法,要麼使用極端的反規範化(將值儲存為序列化 blob 以及可用於推斷當時使用的模式的版本)。這對於任何類型的實時數據庫驅動的應用程序可能都很重要,但對於一直添加新功能(例如,新的配置文件欄位)的社交網路至關重要。

這不是這個意思。很少有系統可以在不使系統離線的情況下更改模式——即使是現代數據庫通常也需要獨占表鎖和表重寫來刪除列。這在某些工作負載中會出現問題。考慮一個可以添加欄位和刪除欄位的通訊錄。如果這些操作中的每一個都通過發出 來更改數據的架構ALTER TABLE,那麼您絕對會陷入混亂。這不是模式應該如何工作的。

所以你有兩個傳統的選擇,

  1. 無模式數據,
  2. 實體-屬性-值模型(通常是無模式和無類型的,而且速度較慢。)

無模式數據

將列儲存為序列化 blob可能聽起來很糟糕,但這只是因為 DBA通常不具備這種工程級別的能力,並且那裡可能存在龍。實現二進制類型只是超出了他們的薪酬等級。這正是高級類型在幕後發生的情況。以 PostgreSQL 為例,

這些類型實際上是引擎蓋下的二進制 blob。數據庫只是為它們提供運算符和字元串化。在 PostgreSQL 中,它們是TOASTABLE二進制類型。

之前JSONB和之前hstore,我們用 . 來實現同樣的事情Storable::nfreeze。這就是作者所說的極端士氣低落。您序列化對象的版本(元數據)和對象本身並將整個事物轉儲到數據庫中。

DBA 使用聲明性語言 (SQL) 編寫並建模和查詢關係數據。這與創建 JSONB 之類的所需技能完全不同。我們是與 Stackoverflow 不同的社區,因為我們擁有不同的技能組合。有多少個數據庫hstore,或者jsonb——甚至是SQL 數組?這些都是難題。做對是 DBA 的一項利基技能。

引用自:https://dba.stackexchange.com/questions/167899