架构说:8.DMVC/mORMot数据库支持对比

架构说:8.DMVC/mORMot数据库支持对比

技术教程gslnedu2025-01-23 11:14:3017A+A-

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的方案更简单直接。

点击这里复制本文地址 以上内容由朽木教程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

朽木教程网 © All Rights Reserved.  蜀ICP备2024111239号-8