首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

跨平台資料庫設計:堅守 ANSI SQL-92、拒絕廠商鎖定

     編輯:MySQL 資料庫相關知識

核心原則

「應該支援」≠「確實支援」。為了應用程式可在 Oracle、SQL Server、MySQL、PostgreSQL 間移植,必須以 ANSI SQL-92 為基準線,避開專有語法。

五大禁區

1. 拒絕儲存程序

  • MySQL 5.0 前不支援;語法差異極大(PL/SQL vs T-SQL vs PL/pgSQL)。
  • 業務邏輯下沉資料庫導致版本綁定、難以版控、難以單元測試。
  • 策略:邏輯留在應用層,資料庫僅做 CRUD。

2. 拒絕複雜 JOIN 語法差異

  • Oracle 舊式 (+) 外連接 vs ANSI LEFT JOIN。
  • 各廠商對 CROSS JOIN、NATURAL JOIN 優化路徑不同。
  • 策略:僅使用標準 INNER JOIN/LEFT JOIN,必要時在應用層組合資料。

3. 僅使用核心 DDL/DML 指令

-- 安全清單
CREATE TABLE, DROP TABLE
INSERT, UPDATE, DELETE, SELECT
ALTER TABLE (ADD COLUMN, DROP COLUMN 僅基本型別)

識別碼含保留字、空格、特殊字元 → 全程雙引號 \"My Table\"(ANSI)或反引號 \`my_table\`(MySQL)。

4. 僅使用跨平台資料型別

✅ 通用安全型別❌ 避免使用
INTEGER, SMALLINT, BIGINTSERIAL, AUTO_INCREMENT, IDENTITY
NUMERIC(p,s), DECIMAL(p,s)MONEY, SMALLMONEY
REAL, DOUBLE PRECISION, FLOATBINARY_FLOAT, BINARY_DOUBLE
VARCHAR(n), CHAR(n)TEXT, NTEXT, CLOB, BLOB (改用檔案儲存)
DATE, TIMESTAMPDATETIME (MySQL), SMALLDATETIME
BOOLEAN / BITBIT(1) 在各平台行為不一

5. 主鍵/外鍵語法標準化

CREATE TABLE parent (
    id INTEGER PRIMARY KEY,
    name VARCHAR(100)
);
CREATE TABLE child (
    id INTEGER PRIMARY KEY,
    parent_id INTEGER REFERENCES parent(id)
);

連接抽象層:ODBC / JDBC

  • 應用隨附所有目標 DB 的 ODBC/JDBC 驅動,安裝時自動註冊。
  • 啟動時偵測 SQLGetInfo(dbc, SQL_DBMS_NAME) 動態調整 SQL 方言(如分頁語法)。
  • 錯誤碼映射統一為應用例外類別。

總結

跨平台不代表「零成本」,而是「可控成本」。堅守 ANSI SQL-92 核心集、封裝方言差異於資料存取層、完善整合測試,才是長久之計。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved