架构说:8.DMVC/mORMot数据库支持对比
1. 数据库支持范围
// DMVC ORM 数据库连接
type
TDBConfig = record
DriverName: string;
Database: string;
UserName: string;
Password: string;
Server: string;
end;
// 1. FireDAC连接示例
procedure ConnectDB(const Config: TDBConfig);
begin
FDConnection.Params.Clear;
case Config.DriverName of
'MSSQL':
begin
FDConnection.DriverName := 'MSSQL';
// MSSQL特定配置
end;
'MySQL':
begin
FDConnection.DriverName := 'MySQL';
// MySQL特定配置
end;
'PostgreSQL':
begin
FDConnection.DriverName := 'PG';
// PostgreSQL特定配置
end;
end;
end;
// mORMot2 数据库连接
// 1. SQLite3引擎(内置)
DB := TSQLRestServerDB.CreateWithOwnModel([TSQLRecord],
'database.db', TSQLModel.Create([]));
// 2. 外部数据库(通过接口)
DB := TSQLRestServerDB.CreateWithOwnModel([TSQLRecord],
'db=test;user=root;password=123', TSQLModel.Create([]),
TSQLDBOracleConnection); // 或其他数据库连接类
2. 数据类型映射
// DMVC ORM 类型映射
type
[MVCTable('products')]
TProduct = class(TMVCActiveRecord)
private
// 通用类型映射
[MVCColumn('id', [dftInteger])]
FID: Integer;
// MSSQL特定
[MVCColumn('description', [dftNText])]
FDescription: string;
// MySQL特定
[MVCColumn('data', [dftLongBlob])]
FData: TBytes;
end;
// mORMot2 类型映射
type
TSQLProduct = class(TSQLRecord)
published
// 统一的类型系统
property ID: TID; // 跨数据库ID类型
property Description: RawUTF8; // 优化的字符串类型
property Created: TTimeLog; // 高性能时间戳
property Data: TSQLRawBlob; // 二进制数据
end;
3. 数据库特定功能
// DMVC ORM - 数据库特定SQL
procedure TOrderRepository.GetPagingSQL(const PageSize, PageNumber: Integer);
begin
case Connection.DriverName of
'MSSQL':
SQL := 'SELECT * FROM Orders OFFSET ? ROWS FETCH NEXT ? ROWS ONLY';
'MySQL':
SQL := 'SELECT * FROM orders LIMIT ? OFFSET ?';
'PG':
SQL := 'SELECT * FROM orders LIMIT ? OFFSET ?';
end;
end;
// mORMot2 - 统一SQL语法
var
Orders: TSQLTable;
begin
// 内部SQL引擎会处理不同数据库的语法差异
Orders := Client.SelectLimit(TSQLOrder,
'Created > ?', PageSize, PageNumber * PageSize, [ADate]);
end;
4. 事务处理
// DMVC ORM 事务
procedure ProcessOrder(Order: TOrder);
begin
ActiveRecordConnection.StartTransaction;
try
// 数据库特定的事务实现
case Connection.DriverName of
'MSSQL':
begin
// MSSQL事务级别设置
ExecuteSQL('SET TRANSACTION ISOLATION LEVEL READ COMMITTED');
end;
'MySQL':
begin
// MySQL事务设置
ExecuteSQL('SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED');
end;
end;
Order.Store;
ActiveRecordConnection.Commit;
except
ActiveRecordConnection.Rollback;
raise;
end;
end;
// mORMot2 事务 - 统一接口
procedure ProcessOrder(Client: TSQLRestClientDB; Order: TSQLOrder);
begin
Client.TransactionBegin(TSQLOrder);
try
// 统一的事务接口,自动处理数据库差异
Client.Add(Order, false);
Client.Commit;
except
Client.RollBack;
raise;
end;
end;
5. 性能优化
// DMVC ORM - 数据库特定优化
type
TOrderOptimizer = class
public
procedure OptimizeQuery(const Connection: TFDConnection);
procedure CreateIndexes(const Connection: TFDConnection);
end;
procedure TOrderOptimizer.OptimizeQuery;
begin
case Connection.DriverName of
'MSSQL':
begin
// MSSQL特定优化
ExecuteSQL('CREATE INDEX idx_order_date ON Orders(OrderDate)');
end;
'MySQL':
begin
// MySQL特定优化
ExecuteSQL('ANALYZE TABLE orders');
end;
end;
end;
// mORMot2 - 自动优化
type
TSQLOrder = class(TSQLRecord)
published
property OrderDate: TDateTime index ixCreate; // 自动创建索引
end;
主要差异:
- 架构设计
- DMVC:依赖FireDAC或ADO,数据库支持由这些组件决定
- mORMot2:自己实现数据库访问层,更独立和一致
- 类型系统
- DMVC:使用Delphi原生类型,需要手动处理映射
- mORMot2:有自己的优化类型系统,跨数据库一致性更好
- SQL处理
- DMVC:需要手动处理不同数据库的SQL差异
- mORMot2:内部SQL引擎自动处理差异
- 性能考虑
- DMVC:性能依赖于底层数据库组件
- mORMot2:自己优化的数据访问层,通常性能更好
选择建议:
- 选择DMVC的情况
- 已有FireDAC或ADO项目
- 需要使用特定数据库功能
- 团队熟悉传统数据库开发
- 项目规模较小
- 选择mORMot2的情况
- 需要高性能
- 需要更好的跨数据库兼容性
- 开发新项目
- 需要NoSQL支持
总的来说,mORMot2在多数据库支持方面更强大和统一,但DMVC的方案更简单直接。