iT邦幫忙

2023 iThome 鐵人賽

DAY 13
1
Software Development

從餐飲業轉職成小白工程師的所見所學系列 第 13

ORM是什麼? ORM的優缺點是...? Day13

  • 分享至 

  • xImage
  •  

今天來談談,當初困擾我很久的 ORM...

首先 ORM(Object-Relational Mapping)是一種軟體開發模式,它允許應用程式以物件導向的方式來操作關聯式資料庫。
簡而言之,ORM將資料庫中的表格、欄位、關聯等映射到程式語言中的物件,使開發者可以使用物件的方式來操作資料庫,而不必直接撰寫 SQL 查詢。

這邊我們使用 Ruby、ActiveRecord 做個簡單的示範:

我們創建一個 User model

class User < ActiveRecord::Base
end

使用 ORM 可以這樣做:

## 查詢所有使用者
all_users = User.all

## 查詢特定使用者
user = User.find_by(id: 1)

##創建新的使用者
new_user = User.create(name: "John", email: "john@example.com")

## 更新使用者
user.update(name: "Updated Name")

## 刪除使用者
user.destroy

如果使用原生的 SQL

## 查詢所有使用者
require 'pg'

conn = PG.connect(dbname: 'your_database_name', user: 'your_username', password: 'your_password')

result = conn.exec('SELECT * FROM users')

all_users = result.map { |row| { id: row['id'], name: row['name'], email: row['email'] } }

## 查詢特定使用者
result = conn.exec_params('SELECT * FROM users WHERE id = $1', [1])

user = result[0]

## 創建新使用者
conn.exec_params('INSERT INTO users (name, email) VALUES ($1, $2)', ["John", "john@example.com"])

## 更新使用者
conn.exec_params('UPDATE users SET name = $1 WHERE id = $2', ["Updated Name", 1])

## 刪除使用者
conn.exec_params('DELETE FROM users WHERE id = $1', [1])


是不是使用 ORM 簡單直觀很多呢!

ORM 的優缺點?

優點:

  1. 簡化資料庫操作:ORM隱藏了資料庫細節,開發者不必直接處理SQL查詢和資料庫連接,使資料庫操作變得更容易。

  2. 物件導向:ORM使開發者能夠使用物件導向的編程模型,這更接近應用程式的邏輯和語言,提高了程式碼的可讀性和維護性。

  3. 跨資料庫支援:多數ORM工具支援多種資料庫系統,這使應用程式更具可移植性,可以輕鬆切換資料庫。

  4. 提高生產力:ORM減少了重複的資料庫操作程式碼,可以節省開發時間並提高生產力。

  5. 自動映射:ORM工具通常提供自動映射資料庫表格和物件的功能,減少了手動配置的需求。

缺點:

  1. 學習曲線:學習使用ORM可能需要一些時間,特別是對於新手來說,需要了解ORM的概念和操作方式。

  2. 性能問題:某些ORM工具可能在處理大量資料或複雜查詢時引入性能問題,因為生成的SQL查詢可能不是最佳的。

  3. 失去控制:使用ORM有時會導致開發者失去對SQL查詢和資料庫細節的控制,這可能對某些特殊場景不適用。

  4. 不適合所有情況:ORM不適合所有應用程式,特別是對於需要高度優化的資料庫操作,或是需要複雜的JOIN操作的情況。

總結來說,ORM是一個方便的工具,特別適合中小型應用程式和快速開發,可以提高開發速度並降低錯誤。
但我們需要根據具體的應用程式需求和性能要求來決定是否使用ORM,以及何時使用ORM。
有時,使用原生SQL仍然是更好的選擇,這一點也是我未來必須要學習了解的地方😂
我們明天見!!


上一篇
API是什麼? Day12
下一篇
關聯式資料庫(RDBMS)、非關聯式資料庫的差異(NoSQL)? Day14
系列文
從餐飲業轉職成小白工程師的所見所學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言