關於關係型數據庫中使用json字段的建議

在我們所設計的所有關係模式(即表)中,有一些字段是JSON格式的。JSON 有很好的靈活性,它可以自由地包含各種鍵。但關係型數據庫對json的處理能力天生不足。因此,在使用json 時應當遵循一定的規範,在JSON靈活性和關係型數據庫的功能之間取得平衡。

下面是我們根據實際工作中的經驗,結合國外一些專家的文章,總結出的觀點。

 

1. json 格式的字段對數據庫最好應該是透明的,因爲傳統的關係型數據庫並不提供json處理功能。近年來Oracle,PostgreSQL 和 MySQL 引入了json 處理功能,但功能有限。

另外,關係型數據庫的第一範式,要求所有字段都是原子性的(雖然我們不必嚴格遵守),此規則應儘量遵守。

 

2. 如果因業務需求,一些 json 格式的字段要用數據庫處理,應該保證,json 結構儘可能簡單,儘量是單層的,由簡單的鍵值對組成。這樣便於讀取,修改和擴展。如果它有複雜的嵌套結構,也應保證內層結構對數據庫儘可能透明。

 

3. 什麼樣的屬性不適合放在 json 中?

(1)作爲重要的選擇條件,或用於連接排序去重分組的屬性。儘管我們可以通過數據庫提供的函數或操作符獲取 json 中的屬性,並通過它進行上述運算,但處理較複雜,性能不佳。這樣的屬性應當作爲原子性的字段存在。

(2)某個屬性的讀取和更新頻率比其他屬性頻繁很多,則它們不適合放在同一個 json 字段中。因爲 json 字段佔用空間很大,讀寫代價都很高。因此爲提高性能,應將讀寫頻繁的屬性作爲單獨的字段。

 

4. 什麼樣的屬性可以放在json 中?

(1) 用戶定義的屬性;

(2) 該屬性是一個集合;

(3) 表中該屬性爲空的元素比例較高;

 

4. 如果因業務原因,需要將表中的幾個字段合併爲json,除了上面的事項,還需要注意什麼?

(1) json 結構儘量簡單,理想的情況下,合併後的json 的鍵和值分別對應原有的字段和它的值。

(2) 避免直接將本身定義不合理的字段放到json 中。它會給整個json帶來麻煩。

(3) 用來合成 json 的原字段最好是原子性的,或者對數據庫是透明的。這樣的字段便於合併,在 json 中也容易解析。

(4) 最後,如果你需要用一些非原子性的字段構造一個複雜的 json,則應該詳細地寫出構造的方法步驟,再進行編碼。

 

5. 如果需要修改數據庫中 json 字段的數據,除了上面的事項,還需要注意什麼?

(1) json 字段的結構確定後,不應該做較大的變動。

(2) 增加,修改或刪除json 字段中的鍵值對時,表上的查詢條件和json 鍵的路徑應該是明確的。即我們能夠直接通過給定條件查詢到需要表中更改的行,並能夠根據 json 鍵的完整路徑來添加,修改或刪除鍵值對。如果該鍵的新值依賴於 json 中某個鍵的值,則被依賴的鍵的路徑也應該是明確的。

 

參考文獻

[1] Colin M. Answer: Storing JSON in database vs. having a new column for each key?. 2017-09-15.  

[2]Vishal Kumar. Answer: Is it okay to use JSON as a database. 2018-06-26.

[3]Arun B Chandrasekaran. Using JSON Datatype In Relational Database To Develop Flexible/Configurable Software. 2018-11-11

[4]Bill Karwin. Answer: Why not use relational databases to store JSON data (like a primary key field, and a BLOB field for JSON data in a MySQL table) instead of using NoSQL databases (MongoDB, etc.)?. 2019-04-14

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章