# PostgreSQL vs MySQL vs SQL Server vs Oracle

對於哪個 SQL 資料庫系統比較優秀，總是存在著爭議。PostgreSQL 和 MySQL 之間的真正區別是什麼？每個管理者都有自己的偏好，每個程式設計師都有自己獨特的程式處理方式。因此，如果您詢問五個不同的系統管理員，他們更喜歡哪個平台，那麼你會得到五個不同的答案。

讓我們來看看我們是否能幫助你自己回答。

今天，我們將看看目前網路上可用的一些主要資料庫管理系統的優缺點。一旦我們完成了這一部分，我們將提供一些建議，以確定每個項目最適合哪個項目。讓我們直接來看看：

## Oracle

* 閉源軟體；免費版本的功能非常有限
* 暫時資料表在不同連線間是持續存在的，必須由使用者自行刪除
* 支援四種不同的字元/字串類型：CHAR，VARCHAR2，NCHAR，NVARCHAR2
* 提供資料表和資料列層級的鎖定
* 廣泛和靈活的指令來自訂儲存引擎，像是資料表空間（tablespace）、同義詞（synonym）和套件（package）
* 廣泛的備份機制
* 設計目標在於管理大規模的資料表和資料庫

## MySQL

* 開放原始碼
* 相容於各式各樣的引擎和介面；這是市場上最成熟的資料庫之一
* 輕量化
* 最流行的資料庫工具之一；很容易在網路上找到支援的資訊
* 暫時資料表只在目前資料庫連線中可以被看見，並在離線之後自動刪除。
* 缺乏全面的 ACID 合規性
* 分割資料表可以使用 LIST、HASH、RANGE 和 SET 等分割方法
* 支援兩種不同的字元/字串型別：CHAR 和 VARCHAR
* 只提供資料表層次的鎖定
* 資料表 view 的選項較少
* 有限的儲存引擎參數調整
* 管理工具非常強大
* 兩種備份機制：mysqlhotcopy 和 mysqldump
* 在大量使用時，經驗上明顯會感受到性能下降。
* 在效能方面，沒有提供什麼最佳化的方式
* 可靠性的問題
* 與其他資料庫系統相比，安全性有限。
* 專為事務性工作負載而設計，因此不適合分析工作負載

## MS SQL Server

* 封閉原始碼，目標為公司或企業的環境。
* 對通用的資料表表示式提供全面的支持
* 需要比其他工具更深入地理解有關於資料庫本身及資料庫的配置方式
* 可以微調安全功能，例如誰可以執行每個自訂函數，或誰可以存取資料等
* 使用稍慢、資源重的資料庫引擎，但完全符合ACID標準。
* 極其全面的回報系統及儲存引擎自訂化
* 高度的交易安全和程序控制
* 社群不是非常活躍，沒有像 MySQL 那樣線上支援。
* 透過一套工具提供簡單的資料庫功能：ETL工具，分析用 DBMS，關連式 DBMS和報表伺服器。
* 資料庫架構更改不需要鎖定資料表。
* 資源佔用相對較高

## DB2

* 閉源軟體。只有付費的企業版本
* 基於 schema 的資料表管理
* 不支援 XML
* 只能通過分割資料表來分散
* 沒有 In-memory 的功能
* 為關連完整性而設計
* 比MySQL更強大的資料表管理
* Materialized table views
* 缺少內建的字元/字串支援
* 多種災難復原選項，具可用性和可擴展性

## PostgreSQL

* 開放原始碼
* 堅持現有的 SQL 標準，並因此更容易學習
* 佔用空間大，不適合讀取繁重的操作
* 先進的商業及地理分析功能
* 豐富多樣的資料型別和字元類型
* 完全符合ACID標準
* 專為可靠性和資料完整性而設計；以開發者為中心設計
* 全文檢索，支持強大的伺服器端程式語言
* 完全支持先進的 SQL 功能，如表格表示式和窗函數功能
* 可以有效地進行大量資料表的交叉查詢
* 複製功能並不是很完整
* 不適合資料一致性較低的專案

## 那麼，你應該使用哪個？

毫無疑問，我們在這裡描述的每個資料庫工具在功能和設計方面都有很大的不同。因此，你選擇哪一個的問題取決於你計劃管理的應用類型。

### 你應該使用 Oracle 如果...

* 你在交易安全控制方面需要更多彈性
* 你計劃管理一個大型資料庫
* 你需要高度的可擴展性
* 你希望你的資料庫是與平台無關的

### 你應該使用 MySQL 如果…

* 你的資料庫不會擴展很大的程度
* 你正在計劃建立一個唯讀的網路應用程式或網站
* 你需要多重的資料複製
* 你的專案只需要簡單的查詢，並且較少處理資料一致性的問題

### 你應該使用 MS SQL Server 如果...

* 你正在 .NET 開發環境中工作。
* 你的資料庫服務於大型的企業環境
* 你關心的是負載量而不是開發應用程式
* 你需要對資料庫進行微調。

### 你應該使用 DB2 如果...

* 你的公司已經在內部建置了一個 DB2 環境
* 你希望串接來自多個來源的資料
* 你需要能夠高速存取資料
* 效能最佳化對你的專案非常重要

### 你應該使用 PostgreSQL 如果…

* 你規劃使用複雜的自訂程序（stored procedure）
* 你將要使用 Java 工作
* 你的資料庫是龐大而復雜的，需要高度的資料一致性，並且有許多種查詢類型
* 你將會進行許多寫入操作，而讀取速度並不是唯一的考量
* 你的專案是以開發人員為中心的

希望這些回答為這個問題提供了一個很好的基礎：PostgreSQL、MySQL 和其他更多資料庫之間有什麼差異？
