iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0
Kotlin

Kotlin魔法:Spring Boot 3的fp奇幻冒險系列 第 12

[小城鎮] 實際儲存資料 - Mongodb

  • 分享至 

  • xImage
  •  

前情提要

今天我們要將memory的list,換成實際的DB,讓我們的資料可以正確的被保存起來。

為什麼選擇MongoDB呢?

MongoDB具有以下優點:

  1. 彈性的數據模型:MongoDB是一個文檔數據庫,它使用BSON(二進制JSON)格式存儲數據,這使得它能夠輕鬆處理不同數據結構和格式的數據,而不需要嚴格的架構。

  2. 高度可擴展性:MongoDB支持水平擴展,可以輕鬆添加更多的節點以處理大量數據。這使得它適用於高流量和大數據應用。

  3. 高性能:MongoDB具有快速的讀寫操作,並且能夠在大規模數據集上提供良好的查詢性能。它還支持索引,以加速查詢操作。

另外MERN架構也是採用mongoDB,對我們的範例來說,看重彈性數據模型和較高的讀寫性能,因此我們選擇MongoDB。

DB的相關知識補充

ORM (Object-Relational Mapping)

ORM是一種軟體設計技術,用於處理物件導向程式設計和關聯式資料庫之間的不同數據model之間的映射。

在傳統的關聯型數據庫中,數據以表格的形式儲存,而在物件導向程式設計中,數據以Class和Object的形式建置。這兩種數據結構之間存在差異,ORM的目標是自動處理這種映射,使開發人員能夠使用物件導向的方式來操作數據庫,而不必擔心底層數據庫結構。

==簡單來說,就是不用寫SQL,然後使用Class或是Object來處理DB中的資料。==

MongoDB不是SQL DB需要ORM嗎?

理論上是的,因為它具有彈性的數據模型,但我們還是能夠使用ORM,來建構一套Data model,讓各層的邏輯更清晰,大大有利於之後的維護擴充。

ACID

ACID(原子性、一致性、隔離性、持久性)是DB的一種特性,我們來利用銀行轉賬交易來進行說明。

假設我們有兩個帳戶:帳戶A和帳戶B,每個帳戶都有餘額。我們將執行轉帳的操作:

轉帳

從帳戶A中扣除一定金額。
將相同金額存入帳戶B中。

ACID的對應

原子性(Atomicity):如果交易的任何一部分(例如扣款或存款)失敗,整個交易應該被Roll Back,以確保沒有部分執行,例如A帳戶錢不夠,B的帳戶卻收到A轉帳的錢(好幸福?)。或是如果A被扣款成功但B存款失敗,也要Roll Back,不然A就哭哭囉。

一致性(Consistency):在交易開始之前,帳戶A和帳戶B的總餘額應該保持不變。在交易完成後,總餘額仍然應該保持不變。這確保了資料庫的一致性狀態。不會有交易後,兩者加起來的錢變多了的狀況。

隔離性(Isolation):如果同時執行多個轉賬交易,每個交易都應該在一個獨立的、隔離的事務中運行。這意味著一個交易不應該看到另一個交易未提交的中間結果。例如,如果A向B轉賬100元,另一個交易也嘗試向B轉賬,應該等待第一筆交易完成。不然這樣就會有不一致的問題,因為兩個交易同時進行的話,A的餘額可能會不足夠完成另一筆交易。

持久性(Durability):一旦交易成功,資料庫必須確保這個交易的效果持久保存,即使資料庫崩潰也不應該消失,例如A轉帳後,錢應該要被減少,就算DB崩潰了它應該也要正確地減少,不然銀行就虧大了XD

這些ACID特性確保了轉賬交易的可靠性和一致性。如果DB遵循ACID原則,則不論發生何種情況,無論是ATM故障、網路問題還是其他錯誤,我們都可以信任DB,它將確保交易的完整性和可靠性。

參考資料

MongoDB 是什麼? MongoDB 優勢、適用場景、與 MySQL 的差異介紹


上一篇
[小鎮] 實作三層架構 - 拆拆拆
下一篇
[小城鎮] 實作吧! MongoDB
系列文
Kotlin魔法:Spring Boot 3的fp奇幻冒險30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言