2012-09-04 99 views
0

我正在創建一個框架MVC來構建我的應用程序。在我的應用程序中,我需要使用多個DBMS,並且需要爲此做好準備。各種查詢生成器

我在想使用活動記錄模式,它有「連接」(抽象)相關聯。活動記錄不知道要使用哪個DBMS。所以,我使用Factory Method來抽象使用哪個DBMS。

我將如何構建各種查詢(CRUD)?因爲每個DBMS都需要特定的查詢。

我認爲創建各種類「QueryBuilder」它可以解決(每個DBMS一個類)。

想什麼?

回答

0

要解決此問題,可以使用DAO圖層模式。該模式隱藏客戶端的數據庫特定細節。您可以定義您的DAO將執行的CRUD操作界面。

這樣,即使你的DB在將來變化,DAO層的客戶端也不必擔心變化。

請參閱下面的wiki頁面以獲得關於此模式的更多詳細信息。

http://en.wikipedia.org/wiki/Data_access_object

+0

我正在這樣做。我的問題是關於查詢生成器(INSERT,UPDATE,DELETE,LIMIT),可以是不同的。 如果爲每個構建一個類「QueryBuilder」。例如:MySQLQueryBuilder。 QueryBuilder將被傳遞給Connection的方法執行。 –

0

我假設的目的是爲了從DB之間的SQL語法差異隔絕各種ActiveRecord對象?

你沒有定義你的確切的意圖與設計爲您的查詢bulder,但我已經完成了一次像AddSelection(colName),AddCriteria(colName, ComparisonEnum, value)等方法如果這是你的方法,那麼如果你的查詢是小/足夠簡單那麼查詢生成器就可以工作。但只要你需要建立複雜連接或內部子查詢的能力,那麼你可能會用這種方法撞牆。

如果您需要處理任意難度的查詢,那麼另一種選擇是創建轉換器或轉換器。如果要定義規範化查詢格式,那麼每個DBMS特定的轉換器都會知道如何從該規範格式轉換爲特定於DB的語法。你確實需要這個功能才能使它值得付出努力。

最後,你的另一個愛好是爲每個數據庫的ActiveRecord子類。所以如果你有一個EmployeeRecord類,你可以使用OracleEmployeeRecord,MySqlEmployeeRecord,MsSqlServerEmployeeRecord等等對它進行子類化。然後使用抽象工廠創建適當的ActiveRecord對象。

+0

感謝您的回答。問題是如果我按照你的說法做,我不會做動態的。想象一下,爲每個模型和每個DBMS創建一個類。這太瘋狂了。 我想要哪些工作很容易。我想要做任何系統而不再做所有事情。這是一個框架。如果有程序員進入企業,他們只會擔心業務層。 –

+0

我假設你指的是我的第三個選項。我在辦公室沒有我的企業應用程序體系結構的副本,但是通過ActiveRecord,您通常可以定義一個類來封裝每個表的行結構。然後您可以使用inhertitence來放置DBMS特定的代碼。這是一個有效的選擇,但是你必須權衡你自己用例的利弊。 – tcarvin