SQL Server 中的 SQL 方言更接近 Oracle 還是 Postgres?
有一個現有的應用程序支持通過 JDBC 將其數據儲存在 Oracle 數據庫或 Postgres 數據庫中。表格和數據是一樣的,但可以安裝在其中任何一個中,以供客戶選擇。
對於 Oracle 的每個 SQL 查詢,Postgres 都有一個等效的查詢,它的功能完全相同,但 SQL 方言差異很小。現在我必須提供第三組 SQL 查詢,在本例中是針對 SQL Server。將它們基於 Oracle 或 Postgres 是否更方便?哪種方言更接近 SQL Server 方言?
從程式碼維護的角度來看,我不會說。
讓每個查詢
$$ class? $$自立門戶。_
如果您開始從另一個繼承一個,並且基本方言發生了一些變化,那麼您也會無意中更改任何派生的方言,這可能不合適。 或者,您可以只使用一組與最低公分母ODBC一起使用的查詢,從而繞過任何特定於方言的問題(將由 ODBC 驅動程序處理)。
我的建議是將它們分開 - 完全分開你的呼叫函式 - 將 db 指定為全域變數或將其儲存在某個文件中並在程序啟動時讀取它。
這種方法背後的原因是:
- 所有這些伺服器都有其優點和缺點。以 PostgreSQL 的
GENERATE_SERIES()
功能為例 - 必須(至少暫時)在其他功能中進行模擬 - Oracle 擁有CONNECT BY
和/或您可以使用RECURSIVE CTE
(不確定 SQL Server 在這方面有什麼,除了 RCTE)。- Oracle 的 PL/SQL 可能是最強大的程序擴展——可能需要其他系統中的程式碼?如果您走最低公分母路線,您將失去 PL/SQL 的所有功能(以及其他系統的功能)。
- T-SQL 和 SQL Server 相同。
- PostgreSQL 的擴展工具非常強大和靈活,在其他系統中沒有真正的對應物。PostgreSQL 中可用的許多不同索引類型也是如此。
我為歐洲最大的鐵路網路之一的 ERP 系統供應商工作——實際上有數十億個小元件、數百萬個燈、開關……這個名單很長。
我是現場新手,我執行了一個查詢來查找
FOREIGN KEY
s 以了解與表相關的內容。結果,我檢索了空集。對此感到困惑(認為我的 SQL 中有錯誤),我詢問了首席程序員,他(自豪地)告訴我,系統“設計為所有搜尋都使用 PK,因此不需要 FK”。從地板上抬起下巴後,我(對自己)就像(對自己)“那麼發生了什麼?DRI(聲明性引用完整性)在哪裡 - 孤兒記錄呢?”) - 但不,這顯然不是問題 -直到它是。後來我發現他們執行夜間工作來檢查這個!
其根源是他們試圖成為“所有人的一切”並在任何(主要)系統上執行 - 這導致了 LCD(最小公分母)方法。一個人想起了伊索寓言——試圖取悅所有人,結果你卻無法取悅任何人!他們可以將數據儲存在 SQLite 中,或者通過一些程式,記事本
<sarcasm>
的所有功能和靈活性!</sarcasm>
.另一個需要關注的因素是供應商總是在升級和添加新特性——你必須有一個“滾動升級”策略,每隔一段時間重新檢查你的程式碼,看看你是否可以利用這些特性並移動(程序-在您的情況下為Java)程式碼到數據庫中。恕我直言,數據庫程式碼盡可能合理地屬於數據庫,而且您可以從更少的往返免費投入的伺服器中受益。您的 RDBMS 是您保護數據的最後一道防線——充分利用它的功能!