我正在创建一个框架 MVC 来构建我的应用程序。在我的应用程序中,我需要使用几个 DBMS,我需要为此做好准备。
我正在考虑使用 Active Record 模式,它具有关联的“连接”(抽象)。Active Record 不知道要使用哪个 DBMS。所以,我使用工厂方法来抽象使用了哪个 DBMS。
我将如何构建各种查询(CRUD)?因为每个 DBMS 都需要特定的查询。
我认为创建可以解决的各种类“QueryBuilder”(每个 DBMS 一个类)。
怎么想?
我正在创建一个框架 MVC 来构建我的应用程序。在我的应用程序中,我需要使用几个 DBMS,我需要为此做好准备。
我正在考虑使用 Active Record 模式,它具有关联的“连接”(抽象)。Active Record 不知道要使用哪个 DBMS。所以,我使用工厂方法来抽象使用了哪个 DBMS。
我将如何构建各种查询(CRUD)?因为每个 DBMS 都需要特定的查询。
我认为创建可以解决的各种类“QueryBuilder”(每个 DBMS 一个类)。
怎么想?
要解决此问题,您可以使用 DAO 层模式。此模式对客户端隐藏了数据库特定的详细信息。您可以为您的 DAO 将实现的 CRUD 操作定义接口。
这样,即使你的 DB 将来发生变化,DAO 层的客户端也不必担心这些变化。
有关此模式的更多详细信息,请参阅下面的 wiki 页面。
我假设目的是将各种 ActiveRecord 对象与数据库之间的 SQL 语法差异隔离开来?
您没有通过查询 bulder 的设计定义您的确切意图,但我已经使用 , 等方法完成过一次AddSelection(colName)
。AddCriteria(colName, ComparisonEnum, value)
如果这是您的方法,那么如果您的查询足够小/简单,那么查询构建器就可以了. 但是,一旦您需要构建复杂连接或内部子查询的能力,那么您可能会用这种方法碰壁。
如果您需要处理任意困难的查询,那么另一种选择是创建转换器或翻译器。如果您要定义规范查询格式,那么每个特定于 DBMS 的转换都知道如何从该规范格式转换为特定于 DB 的语法。不过,您确实需要此功能才能使其值得付出努力。
最后,您的另一个方法是为每个 DB 子类化 ActiveRecord。因此,如果您有一个 EmployeeRecord 类,您可以使用 OracleEmployeeRecord、MySqlEmployeeRecord、MsSqlServerEmployeeRecord 等对其进行子类化。然后使用抽象工厂创建适当的 ActiveRecord 对象。